[英]enable_if for generic operator T()
这是一个示例程序:
#include <type_traits>
#include <stdio.h>
template <typename X>
struct test
{
operator int() const { puts("?"); return 0; }
template <typename T, typename = typename std::enable_if<std::is_same<X, void*>::value, T>::type>
operator T() const { puts("T"); return 0; }
};
int main()
{
test<void*> t;
char* c = (char*)t;
switch (t)
{
case 0: break;
}
return 0;
}
这就是g ++ - 4.7给出的错误
user@user:~$ g++-4.7 -std=c++0x test.cpp
test.cpp: In function ‘int main()’:
test.cpp:13:14: error: ambiguous default typeconversion from ‘test<void*>’
test.cpp:13:14: error: candidate conversions include ‘template<class T, class> test::operator void*() const [with T = T; <template-parameter-2-2> = <template-parameter-1-2>; X = void*]’
g ++ 4.6编译它没有错误,实际上调用了不同的运算符。
有没有办法在g ++ 4.7下完成这项工作?
更新:实际上它工作在4.6而没有任何enable_if ...所以问题仍然适用但我现在不确定enable_if是否会有所帮助。
如果在此处向int
添加显式强制转换:
switch ((int)t)
然后它应该编译。
我认为它抱怨转换是模糊的,因为存在多个可以保持0
值的类型。
我正在使用g ++ 4.8。
我找到了至少一个“可接受”的解决方案:
#define switch(x) \
switch( (typename switch_type<__typeof(x)>::type)(x) )
可以扩展哪个switch_type trait来解决特定应用相关类型(属性类型)的歧义。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.