部分专用化非类型参数
partial specialization non type argument
我在这里需要一些帮助。我是元编程的新手,所以我什至不知道在哪里寻找解决方案(到目前为止我认为这甚至是不可能的)。
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++11(也不是 C++14)中使用原始问题中的语法来完成,因为
- 您只能在模板参数列表的末尾默认模板参数,并且 不能让非类型模板参数
- 接受不同类型的参数值,除非根据 C++11 §14.3.2.5 中的转换规则规则,这些参数可转换为非类型模板参数的类型。
请注意,即使您传递了以这种方式可转换的参数,这也不能帮助您根据参数的原始类型专门化模板。
另请注意,1. 同样适用于函数默认参数,但是对于函数,您可以通过根据参数类型提供重载来解决此问题,这是 skypjack 对问题的评论和 RichardHodges 答案所依赖的工厂模式解决方法所依赖的技巧。
相关文章:
- 在 c++ 中的模板实例化中使用带有构造函数的类作为类型参数
- 如何解决一元"*"(有"字符")错误的无效类型参数?
- "std::shared_ptr":不是参数"_Ty"的有效模板类型参数
- 具有可变参数非类型参数的模板专用化
- 有没有办法根据 lambda 参数返回类型部分专用化我的模板化函数?
- 如何将模板类型名专用化为函数参数?
- 作为模板类型参数,为什么 type[N] 与其专用版本不匹配----模板<类 T>类 S<T[]>
- C++ 按非类型参数类型划分的模板专用化
- C++模板专用化因非类型参数包而失败
- 使用类型参数专用化部分模板参数(VC++ v140 工具集)
- C++任何非类型参数的模板专用化
- 不允许非类型参数的部分模板专用化
- 部分专用化非类型参数
- X 的任何子类的专用类模板,无需向模板添加其他类型参数
- 枚举类型参数的专用成员模板
- 如果给定模板不是运算符参数类型的专用模板,则禁用运算符重载
- C++可以拥有一个包含不同类型参数的专用模板对象的容器
- 使用类型和模板模板参数对模板类中的类型参数进行部分专用化
- C++:将部分专用模板的类型参数作为另一个模板类的成员类型
- 为什么不允许非类型参数中的部分专用化使用嵌套模板参数