Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 有没有更好的方法来解决enable_if bug in CLang(bug 11723)?_C++_Templates_C++11_Clang_Sfinae - Fatal编程技术网

C++ 有没有更好的方法来解决enable_if bug in CLang(bug 11723)?

C++ 有没有更好的方法来解决enable_if bug in CLang(bug 11723)?,c++,templates,c++11,clang,sfinae,C++,Templates,C++11,Clang,Sfinae,理想情况下,我们可以使用enable_执行类似操作,如果: #include <type_traits> namespace detail { enum class enabler_t { DUMMY }; } template<bool B> using enable_if_u = typename std::enable_if<B, detail::enabler_t>::type; template<bool B> using

理想情况下,我们可以使用enable_执行类似操作,如果:

#include <type_traits>

namespace detail {
    enum class enabler_t { DUMMY };
}

template<bool B>
using enable_if_u = typename std::enable_if<B, detail::enabler_t>::type;

template<bool B>
using disable_if_u = typename std::enable_if<!B, detail::enabler_t>::type;

template<typename T, enable_if_u<std::is_same<T, int>::value>...>
int a(){return 0;}

template<typename T, disable_if_u<std::is_same<T, int>::value>...>
double a(){return 0.0;}

int main() {
    auto x = a<int>();
}
#包括
名称空间详细信息{
枚举类启用码{DUMMY};
}
模板
使用enable_if_=typename std::enable_if::type;
模板
使用disable_if_=typename std::enable_if::type;
模板
int a(){return 0;}
模板
双精度a(){return 0.0;}
int main(){
自动x=a();
}
这是最好的使用方法

但是,这不适用于叮当,因为

我使用的解决方法是使用一个伪constexpr变量:

namespace detail {
    enum class enabler_t { DUMMY };
    constexpr const enabler_t dummy = enabler_t::DUMMY;
}

//...

template<typename T, enable_if_u<std::is_same<T, int>::value> = detail::dummy>
int a(){return 0;}

template<typename T, disable_if_u<std::is_same<T, int>::value> = detail::dummy>
double a(){return 0.0;}

//...
名称空间详细信息{
枚举类启用码{DUMMY};
constexpr const enabler\u t dummy=enabler\u t::dummy;
}
//...
模板
int a(){return 0;}
模板
双精度a(){return 0.0;}
//...
我不是这个变通方法的超级粉丝,我想知道是否还有其他变通方法可以让代码在叮当声中工作?我在寻找一个纯C++解决方案,没有预处理器。
这个例子本身就是为了说明这个问题,它一点用处也没有,而且有很多方法可以让它变得更好。我只是想为enable_if部分找到一个更好的解决方法

您应该只使用宏:

#define ENABLE_IF(...) typename std::enable_if<(__VA_ARGS__), detail::enabler_t>::type=detail::enabler_t::DUMMY

您只需在
T=int
时调用第一个
a
,否则调用第二个
a
T
在任何示例中都应该是参数包吗?为什么不使用或标记分派呢?@dyp我意识到,我只是想知道其目的是否是在具有不同返回类型的两个函数之间切换。有更简单的方法来做这件事,正如你刚才所展示的。@ PauleToRe:至少G++(和我的标准阅读)解释它。@ Dyp“为什么……”——因为OP的方式是。好的解决方案,但是我宁愿避免宏,如果可能的话,它感觉不太像C++。我最后还是用了一个宏。所以这个答案是最好的。
#define BW_ENABLE_IF(...) typename std::enable_if<(__VA_ARGS__), detail::enabler_t>::type=detail::enabler_t::DUMMY
#define ZLANG_bw_enable_if (BW_ENABLE_IF)
template<typename T, $(enable_if std::is_same<T, int>())>
int a(){return 0;}