使用 SFINAE 和 void_t 来确定容器内的元素类型
Using SFINAE and void_t to determine type of elements inside a container
在下面的代码中,我试图通过检查容器 C 是否具有成员value_type
来确定容器内元素的类型。如果为 true,我将类型设置为"value_type"。但是,即使类型没有成员value_type并且不是容器,在传递时,编译器似乎也会将HasMemberT_value_type
的第二个参数设置为 True,即使它给出了错误。
template<typename...>
using void_t = void;
template<typename T, typename = void_t<>>
struct HasMemberT_value_type : std::false_type
{
};
template<typename T>
struct HasMemberT_value_type<T, void_t<typename T::value_type>> : std::true_type
{
};
template<typename T, bool = HasMemberT_value_type<T>::value>
struct ElementTypeT
{
using Type = typename T::value_type;
};
template<typename T>
struct ElementTypeT<T, false>
{
};
template<typename T>
using ElementType = typename ElementTypeT<T>::Type;
template<typename T>
void printType(T const& c)
{
std::cout << "Container of " << typeid(ElementType<T>).name() << " elements.n";
}
int main()
{
std::array<char, 5> arr;
char classic[] = {'a', 'b', 'c', 'd'};
//GNU Compiler:
printType<arr>(); //Container of c elements.
printType<classic>(); //ERROR : "In instantiation of ‘struct ElementTypeT<char [4], true>’: ... error: ‘char [4]’ is not a
// class, struct, or union type
// using Type = typename T::value_type;"
}
In instantiation of ‘struct ElementTypeT<char [4], true>
为什么设置为 true??
谢谢。
printType<arr>()
和printType<classic>()
无法编译。它应该是printType(arr)
和printType(classic)
.
另一个问题是ElementTypeT<T, true>
有一个Type
成员,但ElementTypeT<T, false>
没有。因此,当您执行using ElementType = typename ElementTypeT<T>::Type
并在执行printType(classic)
时访问它时,它将失败。
要解决此问题,请修改专用化,以便可以推断数组:
template<typename T, std::size_t I>
struct ElementTypeT<T[I], false>
{
using Type=T;
};
不知道为什么ElementTypeT<char [4], true>
在你的代码中是标准化的。当我运行它时,它对我来说false
。
以下是使用函数重载和 SFINAE 执行此操作的更简单方法:
template<class T>
typename std::decay_t<T>::value_type get_value_type( T&& );
template<class R, std::size_t I>
R get_value_type( R(&)[I] );
template<class T>
void printType(T const& c) {
std::cout << "Container of " << typeid(get_value_type(c)).name() << " elements.n";
}
相关文章:
- 在C++中,如何通过几种类型从元组中选择多个元素
- 如何为 c++ 的不同变量类型的结构元素创建动态数组?
- 在 C++ 中输出枚举类类型的向量元素
- C++默认情况下,指针类型数组的元素是否保证初始化为 nullptr?
- 如何使用模板根据类型将元素添加到各种容器中
- C++ 未初始化的本地(非全局)int 数组中的元素类型到底是什么?
- OpenCV C++:当垫子类型未知时无法访问垫子元素?
- C++如何乘以包含 std::variant 元素的向量的迭代器?正在执行迭代器类型的转换?
- C++:是否可以编写一个函数,将不同类型的元素附加到变体数组中?
- C++通过别名指针以静默方式将错误的类型分配给数组元素
- 我无法在用forward_as_tuple创建的元组中按类型访问元素
- 如何告诉自动推断向量<bool>元素的非引用类型
- 为什么将函数的返回类型从结构节点*更改为void后,链表的元素没有显示create_ll和显示?
- 如何为基类通用类型创建向量以使用具体类型元素
- 按索引将类类型元素从一个向量复制到另一个 c++
- 如何实现数据结构,就像C 中的数组一样支持不同的类型元素
- 如何在构造具有不同类型元素的向量副本时显式转换
- 处理特定类型元素的任何容器的非模板函数
- *类型元素容器的qt排序
- 如何将两个双数据类型元素转换为一个Point数据类型