C++ 向类模板专门化添加方法
我想实现STL中存在的行为:当我们查看向量容器时,我们知道它具有C++ 向类模板专门化添加方法,c++,templates,stl,template-specialization,C++,Templates,Stl,Template Specialization,我想实现STL中存在的行为:当我们查看向量容器时,我们知道它具有vector专门化,它添加了方法flip() 在不将整个类作为专门化复制并在其主体中添加新方法的情况下,是否可以实现这样的类扩展?我想您可以编写专门化,使其从泛型版本继承 示例:假设您有一个struct foo,其中包含一个类型和一个值(具有默认值)模板参数;假设它有一些方法(bar(),在下面的示例中) 你可以核实一下 foo<int> fi; fi.bar(); // compile //
vector
专门化,它添加了方法flip()
在不将整个类作为专门化复制并在其主体中添加新方法的情况下,是否可以实现这样的类扩展?我想您可以编写专门化,使其从泛型版本继承 示例:假设您有一个
struct foo
,其中包含一个类型和一个值(具有默认值)模板参数;假设它有一些方法(bar()
,在下面的示例中)
你可以核实一下
foo<int> fi;
fi.bar(); // compile
//fi.baz(); // compilation error
foo<bool> fb;
fb.bar(); // compile
fb.baz(); // compile
foo-fi;
fi.bar();//编译
//fi.baz();//编译错误
富富餐饮;
fb.bar();//编译
fb.baz();//编译
您可以使用“专门化”方法
模板
C类
{
公众:
//通用代码。。。
模板
仅对_bool(){/*..*/}的_无效
};
C++20将允许更好的语法:
template <typename T>
class C
{
public:
// Common code...
void only_for_bool() requires (std::is_same<bool, T>::value) {/*..*/}
};
模板
C类
{
公众:
//通用代码。。。
void only_for_bool()需要(std::is_same::value){/*..*/}
};
您可以使用stl::vectorNo,no-我想扩展我自己的类,vector
只是一个例子。我的类与向量无关,但我希望根据类型有不同的方法。这很好,我会记住,但我认为@Jarod42 answer更优雅。不过,非常感谢!我有一个问题-模板规范中的bool=true
做了什么?@KONAKONA-哦,是的:Jarod42的解决方案是一个非常好的解决方案。bool=true
声明第二个模板参数,类型为bool
,具有默认值(true
);所以当你定义foo
时,你就是在定义foo
。我使用第二个模板参数从通用版本继承,第一个模板参数的类型相同(bool
)代码>带有空的foo_baz
和foo_baz
的专门化。我一直有一个问题:模板
是否不等同于:模板
?为什么需要执行typename U=T
和最后一个=false
位?对于SFINAE,方法应该是模板。类是不够的,因此您将出现硬错误,而不是替换失败。typename=std::enable_如果t
可以被劫持仅用于\u bool
,则不允许其他具有补充条件的重载(如果您想要不同版本的int
和bool
)(因为默认模板不是签名的一部分)<代码>标准::如果\U t=false允许互补条件,则启用\U,不能劫持(条件还应检查所提供代码中的t==U
)。
foo<int> fi;
fi.bar(); // compile
//fi.baz(); // compilation error
foo<bool> fb;
fb.bar(); // compile
fb.baz(); // compile
template <typename T>
class C
{
public:
// Common code...
template <typename U = T, std::enable_if_t<std::is_same<bool, U>::value, bool> = false>
void only_for_bool() {/*..*/}
};
template <typename T>
class C
{
public:
// Common code...
void only_for_bool() requires (std::is_same<bool, T>::value) {/*..*/}
};