C ++:泛型类中的非泛型方法?

时间:2013-08-17 14:00:25

标签: c++ templates

我有兴趣为特定数据类型定义泛型类的自定义方法。我不确定这是实现它的好方法。如果我将它放在课外,我将无法访问类变量,因此我认为我永远无法以这种方式工作。如果我将它放在类中,它意味着适用于任何类型T而不仅仅是特定类型。我已经能够通过定义它的通用版本并仅将该类型作为我感兴趣的输入发送,但有没有更简洁的方法来实现这一点,从而使我的代码能够以后一种方式工作?

以下是一些明确的代码

#include<iostream>
#include<string>
using namespace std;

template<typename  T>
class abc
{
public:
    void myvoid();
};

template<typename string>
void abc<string>::myvoid()
{
    cout<<"This portion should execute only if an instance of class is called with a    string parameter" ;
}

int main()
{
abc<int> int1;
abc<string> string1;
string1.myvoid(); //should work good
int1.myvoid(); //shouldnt execute myvoid
}  

2 个答案:

答案 0 :(得分:5)

如果使用错误类型的方法,您可以使用static_assert来阻止编译:

#include <type_traits> // for std::is_same

template <typename T>
struct Foo
{
  void foo() const {}
  void bar() const
  {
    static_assert(std::is_same<T, int>::value, "T is not int");
  }
};

int main()
{
  Foo<double> fd;
  fd.foo();       // OK
  //fd.bar();     // ERROR: bar() only works with Foo<int>
  Foo<int> fi;
  fi.foo();       // OK
  fi.bar();       // OK
}

或者,您可以使用SFINAE来控制相关方法所存在的类型。

template <typename T>
class Foo
{
 public:
  void foo() const {}

  template<typename T2 = T,
           typename = typename std::enable_if<std::is_same<T, int>::value>::type>
  void bar() {}
};

请参阅this related question

答案 1 :(得分:1)

如果您尝试在非专用类型上调用bar(),则会出现链接器错误。这适用于gcc 4.8(参见:http://ideone.com/KbwToR

#include <iostream>
using namespace std;

struct Foo
{
   template <class T>
   void bar(T);
};

template<>
void Foo::bar<int>(int i)
{
   cout << i << '\n';
}

int main()
{
   Foo f;

   f.bar(1);
   f.bar("Fail!");

   return 0;
}