Сделать шаблон, принимающий определенный класс / семейство классов? - PullRequest
0 голосов
/ 24 июня 2010

У меня есть шаблонный метод, предназначенный для работы с определенным набором классов.Поскольку у меня нет реальной потребности в полиморфизме во время выполнения, я решил не использовать указатели на родительский класс, а вместо этого заставит компилятор собрать все для меня.

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

Возможно ли это?

Ответы [ 3 ]

1 голос
/ 24 июня 2010

Да. Это возможно с использованием ряда различных техник в зависимости от конкретных потребностей дня. Там есть boost :: enable_if. Есть MPL и static_assert ... (используйте BOOST_STATIC_ASSERT, если вы не используете компилятор C ++ 0x) Есть Boost.Concepts.

Да. Это возможно.

0 голосов
/ 25 июня 2010

Вы можете сделать что-то вроде того, что сказал Матье, написать отдельные функции для каждого типа, который вы поддерживаете (он все еще может вызывать функцию шаблона в бэкэнде), или использовать динамический полиморфизм и наследование.Это должны быть единственные варианты, которые вы должны рассмотреть, чтобы делать то, что вы хотите.

Однако вопрос, который вы задаете, заставляет меня поверить, что это неправильное понимание шаблонов и статического полиморфизма.Шаблон функции / класса накладывает ограничение на типы, с которыми он может работать через фактический генерируемый код.Открытый интерфейс, который используется в таких функциях / классах, определяет ограничения на типы, которые могут быть приняты.Нет необходимости накладывать дополнительные ограничения на это.Почему вы хотите ограничить типы, которые шаблон класса / функции может поддерживать больше, чем уже установленные ограничения?

Допустим, вы пишете шаблон функции, который может работать только с типами, которые реализуют открытый интерфейс, состоящий изсредство доступа к жизни, функция уничтожения и функция поедания (в основном, любого живого организма).Это ограничение, которое оно накладывает: вам не нужно ограничивать гибкость, уменьшая количество типов, которые будут работать с шаблоном функции, помимо этого или определяя какие-либо конкретные типы организмов, которые будут работать таким образом.Шаблон уже требует, чтобы этот интерфейс типа живого организма был реализован.

0 голосов
/ 24 июня 2010

С другой стороны, вы также НЕ можете использовать шаблон.

Допустим, вы хотите, чтобы метод работал только на Car и Dog.Очевидно, что они совершенно не связаны ... но они все еще могут двигаться.

// move.h
#include <boost/variant.hpp>

class Car;
class Dog;

typedef boost::variant<Car*,Dog*> move_type;

void move(move_type m);


// move.cpp
#include <boost/apply_visitor.hpp>

#include "car.h"
#include "dog.h"
#include "move.h"

struct Mover: boost::static_visitor<>
{
  void operator()(Car* c) const { c->advance(); }
  void operator()(Dog* d) const { d->run(); }
};

void move(move_type m)
{
  boost::apply_visitor(Mover(), m);
}

И это даже лучше, чем типичный шаблон, потому что реализация находится в исходном файле:)

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