有没有办法(在C ++中)创建一个实现某些功能的模板类?

时间:2018-01-24 21:58:17

标签: c++ c++11 templates template-specialization sfinae

我想创建一个只接受某些类型的模板类的类。我知道存在模板特化,但我希望我的类接受实现特定功能的所有模板,搜索。

我们假设我有class A如下:

template<class T> //add a restriction that T implements bool search(T)
class A
{
    T t;
    //do something that uses T.search(T x)
    if(t.search(x))
        //Do something
};

基本上,我想创建一个适用于所有具有搜索功能的类的泛型类。有没有办法做到这一点?

1 个答案:

答案 0 :(得分:2)

  

我想创建一个适用于具有搜索功能的所有类的泛型类。有没有办法做到这一点?

例如,使用decltype()如下

template <typename T,
          typename = decltype(std::declval<T>().search(std::declval<T>()))>
class A
 {
 };

以下是size()已启用class A

的完整编译示例
#include <string>
#include <type_traits>

template <typename T, typename = decltype(std::declval<T>().size())>
class A
 {
 };

int main()
 {
   A<std::string>  as;
   //A<int>          ai;  // compilation error
 }

此解决方案存在一个缺点:您可以劫持它,解释第二个模板参数;例如,以下代码编译

A<int, void>  ai;

要避免此问题,您可以按如下方式使用部分特化

template <typename T,
          typename = decltype(std::declval<T>().search(std::declval<T>()))>
class A;

template <typename T>
class A<T>
 {
 };