我目前正在移植我的库,但我的黑暗模板魔法不会用 GCC 5.3 编译
此片段在使用 MSVC2015 Update 2 编译时按预期工作
template<typename vreal =
std::enable_if<std::is_vreal<vreal>::value,
floatType>::type>
inline vreal foo(vreal bar)
{
return bar;
}
template<typename vreal =
std::enable_if<std::is_vreal<vreal>::value,
floatType>::type>
struct bar { vreal i; };
GCC 抱怨“当前范围内未定义 vreal(WTF?)”
到目前为止我已经尝试过:
将上面的模板片段重写为
template<typename vreal,
typename enable = typename std::enable_if<std::is_vreal<vreal>::value != 0>::type>
但这也不起作用。它在代码的后期中断了很多,我认为这是由于引入了额外的模板参数。
另外,我不明白为什么我必须引入与 0 的比较。没有它,gcc 抱怨在 enabled_if 上缺少“类型”。
所以,主要问题是:如何在没有额外参数的情况下获得相同的 SFINAE 逻辑(仅在参数为 vreal 时编译)。
我可以重写它以返回 SFINAE 类型——但这将是很多我想避免的工作(区分函数、类、结构、typedefs / usings ...),即使它包含在宏中。
template<typename vreal>
typename std::enable_if<is_vreal<vreal>, vreal>::type inline vreal .....