我已经将我的问题提炼成一个小例子,请原谅宏。似乎这篇文章中的类似问题不再是 VS 中的问题并且编译得很好。我相信我有这个问题的更专业版本尚未修复,但想确保我没有遗漏任何东西。以下代码在 GCC 中编译并按预期运行,但在 VS 中给出错误 C2893(无法专门化函数模板):
宏.h:
#define If(x) \
template<class T,class...Args, typename std::enable_if<std::is_same<T, x>::value>::type* = nullptr>
#define Do void Func(Args... args)
定义.cpp:
#include <string>
#include <iostream>
#include "Macros.h"
using namespace std;
int answer = 42;
double pie = 3.14;
string s = "Hello World";
// Function Definitions
If(int) Do { cout << answer << endl; }
If(double) Do { cout << pie << endl; }
If(string) Do { cout << s << endl; }
// Explicit Instantiations
template void Func<int>(int, double, string);
template void Func<double>();
template void Func<string>();
用法.cpp:
#include <string>
#include <type_traits>
#include "Macros.h"
// Template Function Declaration
If(T) Do;
int main() {
using namespace std;
Func<int>(5, 2.0, string("hello"));
Func<double>();
Func<string>();
}
与另一篇文章中的示例一样,如果实例化来自函数中的实际使用,则它可以正常工作。在这个例子中这样做很简单,但对我的代码来说并不那么简单。