如何使用具有特定方法的类来实例化C ++模板

时间:2011-06-17 00:01:17

标签: c++ templates inheritance

假设我们有一个班级

class X {
public:
  void my_method() { std::cout << "I'm X"; }
} 

我们有一个模板类:

template<typename T> 
class Y
{
public:
    void put(typename T item) { item.my_method(); }

};

如果使用X类实例化类Y,我想执行item.my_method();(如果不存在编译错误)。我该如何解决这个问题?

4 个答案:

答案 0 :(得分:3)

我不确定我是否完全理解这个问题,因为你的工作是什么。

class X
{
public:
    void my_method() { std::cout << "I'm X"; }
};

class Z
{
};

template <typename T>
class Y
{
public:
    void put(T item) { item.my_method(); }
};

int main(int argc, char* argv[])
{
    // This compiles fine
    X theX;
    Y<X> theXY;
    theXY.put( theX );

    // ERROR: This fails to compile
    Z theZ;
    Y<Z> theYZ;
    theYZ.put( theZ );
}

当Y与没有my_method()成员的类一起使用时,它无法编译。

答案 1 :(得分:2)

你想要的是template specialization

template<>
class Y <X>
{
public:
    void put(X item) { item.my_method(); }
};

答案 2 :(得分:2)

我相信只要不调用Y(模板特有的东西),如果用X以外的类实例化put,就不会出现编译错误

如果put需要针对不同类型执行不同的操作,则可以使用模板专门化。

答案 3 :(得分:1)

简单地取消模板put方法并仅为X类型创建它。如果TX,请在方法内部进行检查。

template<typename T> struct IsX;  // unimplemented for rest of types
template<> struct IsX<X> { typedef X yes; };  // implemented for 'X' alone

template<typename T> 
class Y
{
public:
  void put (X item) { typedef typename IsX<T>::yes check; item.my_method(); }
                    //^^^^^^^^^^^^^^^ compile time ensure that it's for 'X only
};