我的 SFINAE 代码使用std::enable_if
可在 GCC 和 Clang 中编译,但不能在 MSVC 2013 中编译。
代码 (也可以在 cpp.sh 上找到 http://cpp.sh/9jsq5) is
#include <iostream>
#include <type_traits>
template <typename T, typename ... AdditionalInputs>
typename std::enable_if<sizeof...(AdditionalInputs) == 0, void>::type
CallDoDataProcessing(T var) {
std::cout << sizeof...(AdditionalInputs) << " additional inputs" << std::endl;
}
template <typename T, typename ... AdditionalInputs>
typename std::enable_if<sizeof...(AdditionalInputs) == 1, void>::type
CallDoDataProcessing(T var) {
std::cout << sizeof...(AdditionalInputs) << " additional inputs" << std::endl;
}
int main() {
CallDoDataProcessing<int>(3);
CallDoDataProcessing<int, int>(3);
return 0;
}
在 GCC/Clang 中,这工作得很好,但在 MSVC 中,我得到:
Error 1 error C2039: 'type' : is not a member of 'std::enable_if<false,void>' c:\Users\mrussell\documents\visual studio 2013\Projects\ConsoleApplication1\ConsoleApplication1\ConsoleApplication1.cpp 5 1 ConsoleApplication1
编译和运行的输出应该是:
0 additional inputs
1 additional inputs
我在 SO 上看到过一些类似的问题,但没有一个有明确的答案或有点离题。
正在阅读MSVC 启用_如果 https://msdn.microsoft.com/en-us/library/ee361639(v=vs.120).aspx页面,这应该可以...
如何在 MSVC2013 中使用 SFINAE?
UPDATE
需要注意的是,这在积极的情况下确实有效。例如,如果我注释掉第一个函数以及对它的调用,那么其余的函数就会编译。即enable_if<true, void>
on CallDoDataProcessing
确实有一个type
member.
但是,注释掉第二个函数并调用它(因此,将版本保留在sizeof...(AdditionalInputs) == 0
但不起作用。同样的错误。
这表明sizeof...(AdditionalInputs) == 0
呼叫不匹配,但我不明白为什么不匹配。