是否可以有一个带有可选模板参数的类,可以像这样调用?:
#include <iostream>
template <typename T = void>
class A final
{
public:
// This class can be called only when T exists.
void f()
{
printf("%d\n", member);
}
// This method can be called only when T is missing.
void g()
{
printf("No template parameter\n");
}
public:
T member;
};
int main()
{
A<int> a1;
A a2;
a1.f(); // should be valid
a1.g(); // should be invalid, cannot compile
a2.f(); // should be invalid, cannot compile
a2.g(); // should be valid
return 0;
}
如果是,应该使用哪些 std 函数?
您可以使用“旧”方式进行专业化:
通过将你的类变成可变参数,将缺少的参数处理为空包,而不是 void,你可以这样做:
成员函数API的约束
您可以利用约束和概念,特别是以下
std::same_as
概念:那会员呢?
如果您只希望该成员针对某些专业化而存在,则可以将其包装在您相应专业化的类模板中。例如:
另一种方法是使用辅助基类来继承成员,这在 A 的构造函数依赖于类型本身的特征时尤其有用。Eg
std::optional
通常使用各种基类的 mixin 来实现。您可能还想对
A
类的模板参数本身进行限制,以限制在类中包装哪种类型有意义。使用最小方法: