将方法添加到类模板特化

问题描述 投票:2回答:2

我想实现STL中存在的行为:当我们看一个向量容器时,已知它有vector<bool>特化,它添加了方法flip()

是否有可能实现这样的类扩展而不将整个类复制为专门化并在其体内添加新方法?

c++ templates stl template-specialization
2个回答
1
投票

你可以SFINAE的“专业化”方法

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() {/*..*/}
};

C ++ 20将允许更好的语法:

template <typename T>
class C
{
public:
    // Common code...

    void only_for_bool() requires (std::is_same<bool, T>::value) {/*..*/}
};

1
投票

我想你可以编写专门化,因此它继承了泛型版本。

例如:假设你有一个带有类型和值(带默认值)模板参数的struct foo;假设它有一些方法(bar(),在下面的例子中)

template <typename, bool = true>
struct foo 
 { void bar () {}; };

并且假设您想要使用相同的方法和另外的boolbaz()(作为模板类型)进行专门化;您可以从常规版本继承foo<bool>,如下所示

template <>
struct foo<bool> : public foo<bool, false>
 { void baz () {}; };

你可以验证一下

   foo<int>   fi;

   fi.bar();   // compile
   //fi.baz(); // compilation error

   foo<bool>  fb;

   fb.bar();  // compile
   fb.baz();  // compile
© www.soinside.com 2019 - 2024. All rights reserved.