c++ - 偏特化非类型参数

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

最佳答案

我能做的最好的是:

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/

相关文章:

c++ - Makefile 没有产生预期的文件输出

c++ - 这些构造函数有什么区别?

c++ - 如何在 Windows Phone 8 中获取程序包名称

delphi - Delphi 中泛型类型的算术运算

c++ - 如何在现代 C++ 中基于另一组可变参数模板参数来表示可变参数模板类型?

c++ - 为 vector 的 vector 提供平坦迭代器的优雅方式

c++ - glPolygonMode 问题 - GL_FILL "skipping"个顶点

c++ - 对类模板签名的条件检查(例如 HashSet + HashMap)

templates - 防止模板中转义正斜杠

c++ - 为什么不考虑特定值的模板?