我需要一些帮助。我是元编程的新手,所以我甚至不知道在哪里寻找解决方案(到目前为止,我认为甚至不可能)。
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;
}
答案 0 :(得分:2)
我能做的最好的就是:
AddNewView(String text){
TextView textView = new TextView(this);
textView.setText(text);
addView(textView);
}
编辑:
如果您需要命名类型(例如,用作类中的数据成员):
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;
}
答案 1 :(得分:0)
使用原始问题中的语法无法在C ++ 11(也不是C ++ 14)中完成此操作,因为
请注意,即使您传递了一个可以这种方式转换的参数,这也无法帮助您根据参数的原始类型对模板进行专门化。
另请注意1.同样适用于函数默认参数,但是对于函数,您可以通过基于参数类型提供重载来解决问题,这是skypjack提出的工厂模式解决方法的技巧评论问题,RichardHodges answer依赖。