1

我有兴趣为仅针对特定数据类型的泛型类定义自定义方法。我不确定什么是实现它的好方法。如果我将它放在类之外,我将无法访问类变量,所以我认为我永远无法让它以这种方式工作。如果我将它放在类中,它意味着适用于任何类型 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
}  
4

2 回答 2

4

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

请参阅此相关问题

于 2013-08-17T14:02:49.397 回答
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;
}
于 2013-08-17T14:14:08.203 回答