【发布时间】:2017-08-08 10:34:16
【问题描述】:
我尝试实现自己的 SFINAE 测试以确定模板变量的类型,在本例中是标量还是向量:
#include <iostream>
#include <vector>
template <typename...>
using void_t = void;
template <typename, template <typename> class, typename = void_t<>>
struct detect : std::false_type {};
template <typename T, template <typename> class Op>
struct detect<T, Op, void_t<Op<T>>> : std::true_type {};
template <typename T>
using toSize_t = decltype(std::declval<T>().size());
template <typename T>
using has_toSize = detect<T, toSize_t>;
int main(void)
{
std::cout << "Hello World\n";
std::vector<int> vec_a;
std::vector<double> vec_b;
double scal_a;
int scal_b;
std::cout << "scal_b is a vector: " << detect<int, has_toSize>{} << '\n';
return 0;
}
现在,int 肯定没有成员函数 size(),但我仍然得到 true 而不是 false 值。为什么?
【问题讨论】:
-
你的意思是写
.. << has_toSize<int>{}? -
那行得通,但我举了那个例子:coliru.stacked-crooked.com/a/7eae9c76232a2d20,它就是我写的。
-
但该示例没有像您的
has_toSize这样的别名。如果您要写detect<int, toSize_t>,它将像您的示例一样。你正在做的是使用detect两次。