部分特化非类型参数

时间:2016-03-16 07:33:20

标签: c++ templates c++14

我需要一些帮助。我是元编程的新手,所以我甚至不知道在哪里寻找解决方案(到目前为止,我认为甚至不可能)。

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;
}

2 个答案:

答案 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. 您只能在模板参数列表的结束处默认模板参数,并且
  2. 您不能拥有非类型模板参数接受不同类型的参数值,除非根据C ++11§14.3.2.5中的转换规则规则它们可转换为非类型模板参数的类型
  3. 请注意,即使您传递了一个可以这种方式转换的参数,这也无法帮助您根据参数的原始类型对模板进行专门化。

    另请注意1.同样适用于函数默认参数,但是对于函数,您可以通过基于参数类型提供重载来解决问题,这是skypjack提出的工厂模式解决方法的技巧评论问题,RichardHodges answer依赖。