Я перевел свою проблему на небольшой пример, простите за макрос. Кажется, похожая проблема из этой записи больше не является проблемой в VS и компилируется нормально. Я считаю, что у меня есть более специализированная версия этой проблемы, которая не была исправлена, но хочу убедиться, что я что-то не пропустил. Следующий код компилируется в GCC и выполняется ожидаемым образом, но выдает ошибку C2893 (не удалось специализировать шаблон функции) в VS:
Macros.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)
Definition.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>();
Usage.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>();
}
Как и в примере из другого поста, он работает правильно, если экземпляры получены из фактического использования в функции. Это легко сделать с этим примером, но не так просто с моим кодом.