[英]C++ detect any constructor with SFINAE
我试图创建一个模板类,它应该通过使用SFINAE和可变参数模板来检测任何构造函数。 这是模板的代码:
template <typename Type, typename ... Arguments>
struct IsConstructible
{
template <typename U, decltype(U(Arguments...))* = nullptr>
static char test();
template <typename U>
static long test(...);
static constexpr bool value = sizeof(test<Type>()) == sizeof(char);
};
但是,当我用以下类型测试时:
struct MyBadType {
MyBadType(int x) { }
};
结果如下:
IsConstructible<MyBadType, int>::value;
是0.我的模板检查器有什么问题吗? 我正在使用MSVS 2015 express。
代码不应该编译; 如果MSVC这样做,那么它使用扩展。
template <typename U, decltype(U(Arguments...))* = nullptr>
这种decltype
表达没有意义。 U(Arguments...)
是一个函数类型,但是你想从Arguments...
获得构造U
的类型Arguments...
您可以使用std::declval
:
template <typename U, decltype(U(std::declval<Arguments>()...))* = nullptr>
还有第二个问题:
template <typename U, decltype(U(std::declval<Arguments>()...))* = nullptr>
static char test();
template <typename U>
static long test(...);
test<type>()
调用将是不明确的。 解决歧义的“经典”方法是为首选版本提供一个虚拟参数:
template <typename U, decltype(U(std::declval<Arguments>()...))* = nullptr>
static char test(int);
// here ^^^
template <typename U>
static long test(...);
然后调用test<type>(0)
的函数。
请参阅此博客文章 ,了解更灵活的方法来解决过载歧义。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.