Как я могу создать шаблон C ++ с классом с конкретными методами - PullRequest
3 голосов
/ 17 июня 2011

Допустим, у нас есть класс

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

};

Я хочу выполнить item.my_method();, если экземпляр класса Y создан с помощью Xкласс (если бы не было ошибки компиляции).Как я могу решить это?

Ответы [ 4 ]

3 голосов
/ 17 июня 2011

Не уверен, что я полностью понимаю вопрос, потому что у вас работает.

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(), он не может скомпилироваться.

2 голосов
/ 17 июня 2011

Я полагаю, что вы не получите ошибку компилятора, если создадите экземпляр Y с классом, отличным от X, если вы не вызовете put (что-то уникальное для шаблонов).

Вы можете использовать специализацию шаблонов, если put нужно делать разные вещи для разных типов.

2 голосов
/ 17 июня 2011

То, что вы хотите, это специализация шаблона :

template<>
class Y <X>
{
public:
    void put(X item) { item.my_method(); }
};
1 голос
/ 17 июня 2011

Просто не шаблонизируйте метод 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
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...