假设我们有一个班级
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();
(如果不存在编译错误)。我该如何解决这个问题?
答案 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
类型创建它。如果T
为X
,请在方法内部进行检查。
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
};