Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 向类模板专门化添加方法_C++_Templates_Stl_Template Specialization - Fatal编程技术网

C++ 向类模板专门化添加方法

C++ 向类模板专门化添加方法,c++,templates,stl,template-specialization,C++,Templates,Stl,Template Specialization,我想实现STL中存在的行为:当我们查看向量容器时,我们知道它具有vector专门化,它添加了方法flip() 在不将整个类作为专门化复制并在其主体中添加新方法的情况下,是否可以实现这样的类扩展?我想您可以编写专门化,使其从泛型版本继承 示例:假设您有一个struct foo,其中包含一个类型和一个值(具有默认值)模板参数;假设它有一些方法(bar(),在下面的示例中) 你可以核实一下 foo<int> fi; fi.bar(); // compile //

我想实现STL中存在的行为:当我们查看向量容器时,我们知道它具有
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) {/*..*/}
};