首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >泛型运算符T()的enable_if

泛型运算符T()的enable_if
EN

Stack Overflow用户
提问于 2014-05-13 12:27:15
回答 2查看 144关注 0票数 3

下面是一个示例程序:

代码语言:javascript
复制
#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给出的错误

代码语言:javascript
复制
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是否会有所帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-20 14:19:43

我找到了至少一个“可接受的”解决方案:

代码语言:javascript
复制
#define switch(x) \
    switch( (typename switch_type<__typeof(x)>::type)(x) )

可以扩展哪些switch_type特性来解决特定应用程序相关类型(属性类型)的歧义。

票数 0
EN

Stack Overflow用户

发布于 2014-05-13 12:48:23

如果在这里向int添加显式强制转换:

switch ((int)t)

那么它应该编译。

我认为这是在抱怨转换是模棱两可的,因为有多个类型可以保存0值。

不过,我使用的是g++ 4.8。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23631275

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档