0

我已经将我的问题提炼成一个小例子,请原谅宏。似乎这篇文章中的类似问题不再是 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>();
}

与另一篇文章中的示例一样,如果实例化来自函数中的实际使用,则它可以正常工作。在这个例子中这样做很简单,但对我的代码来说并不那么简单。

4

0 回答 0