Как сделать так, чтобы перегруженные шаблоны принимали производные классы из разных базовых классов? - PullRequest
2 голосов
/ 17 ноября 2009

Я хочу иметь возможность определить

template <class TX>
void f(const TX &x){ ... }
template <class TY>
void f(const TY &x){ ... }

где TX должен быть получен из BaseX, а TY должен быть получен из BaseY (как я могу указать такие вещи?), И я хочу иметь возможность назвать его как

f(DerivedX<T>())

Очень важно, чтобы я мог не указывать параметры шаблона. Возможно ли это, и если да, то как бы я это реализовал? Если это невозможно, могу ли я заставить шаблонную функцию принимать только определенные типы, но при этом неявно создавать ее экземпляр? Я не могу просто сделать так, чтобы перегрузки f принимали базовый класс, потому что мне нужен тип производного класса.

Ответы [ 2 ]

6 голосов
/ 17 ноября 2009

Вы можете использовать is_base_of из Boost.TypeTraits примерно так:

#include <boost/type_traits.hpp>
#include <boost/utility.hpp>

class BaseX { };
class BaseY { };

class DerivedX : public BaseX { };
class DerivedY : public BaseY { };

template <typename TX>
boost::enable_if<boost::is_base_of<BaseX, TX>, void>::type
f(const TX& x) 
{
}

int main(int argc, char** argv)
{
    DerivedX x;
    DerivedY y;

    f(x); // compiles
    f(y); // will cause a compilation error
}

Библиотека Boost.TypeTraits предназначена только для заголовков, поэтому вам не нужно ничего связывать.

0 голосов
/ 17 ноября 2009
template <class TX>
void f(const BaseX &x){ ... }
template <class TY>
void f(const BaseY &x){ ... }

f<DerivedX>(DerviedX<T>())

Мне кажется, это проще всего. Вы можете использовать boost is_base_of , если вы не хотите указывать явный аргумент шаблона.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...