我需要一些帮助。我是元编程的新手,所以我什至不知道去哪里寻找解决方案(到目前为止我认为这是不可能的)。
template<typename T, void(*FuncPtr_A)(int), int(*FuncPtr_B)() = nullptr>
class DummyClass
{ };
template<typename T, int(*FuncPtr_B)()>
class DummyClass<T, nullptr, FuncPtr_B>
{ };
void FUNC_A(int) { }
int FUNC_B() { return 0; }
int main()
{
DummyClass <int, FUNC_A, FUNC_B> test1; // works
DummyClass <int, FUNC_A> test2; // works
DummyClass <int, FUNC_B> test3; // error: is there any way to make this work?
return 0;
}
最佳答案
我能做的最好的是:
namespace detail {
template<typename T, void(*FuncPtr_A)(int), int(*FuncPtr_B)()>
class DummyClass
{ };
}
template<class T, void(*FuncPtr_A)(int)>
auto DummyClass()
{
return detail::DummyClass<T, FuncPtr_A, nullptr>();
}
template<class T, int(*FuncPtr_B)(void)>
auto DummyClass()
{
return detail::DummyClass<T, nullptr, FuncPtr_B>();
}
template<class T, void(*FuncPtr_A)(int), int(*FuncPtr_B)(void)>
auto DummyClass()
{
return detail::DummyClass<T, FuncPtr_A, FuncPtr_B>();
}
void FUNC_A(int) { }
int FUNC_B() { return 0; }
int main()
{
auto test1 = DummyClass <int, FUNC_A, FUNC_B>(); // works
auto test2 = DummyClass <int, FUNC_A> (); // works
auto test3 = DummyClass <int, FUNC_B> (); // works
return 0;
}
编辑:
如果您需要命名类型(例如用作类中的数据成员):
int main()
{
decltype(DummyClass <int, FUNC_A, FUNC_B>()) test1 {}; // works
decltype(DummyClass <int, FUNC_A> ()) test2 {}; // works
decltype(DummyClass <int, FUNC_B> ()) test3 {}; // works
return 0;
}
关于c++ - 偏特化非类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36029307/