Шаблоны C ++: предотвращение создания базового шаблона - PullRequest
2 голосов
/ 12 января 2010

У меня есть интерфейс

std::string
get_string(Source const &s, std::string const &d);
int
get_int(Source const &s, int const &d);
bool
get_bool(Source const &s, bool const &d);

, который я хотел бы изменить на

template<class T>
T
get(Source const &s, T const &d);

Но нет разумного базового шаблона , поэтому фактическое базовое определение является легальным, но бесполезным (return d;). Что я могу сделать, чтобы вызвать сбой во время компиляции, если база была создана? Есть ли идиоматическое решение для этой ситуации?

Ответы [ 4 ]

10 голосов
/ 12 января 2010

Не определяйте шаблон, просто объявите его и определите три специализации.

template <typename T>
T get(Source const &, T const &);

template<>
std::string get(Source const &s, std::string const &d) {
    return d + s.stringval(); // or whatever
}

[Редактировать: убрал материал о перегрузках - на этот раз специализация шаблонных функций действительно кажется лучше. Кто бы мог подумать?]

3 голосов
/ 12 января 2010

просто сделай

string get(source, string);
int get (source, int);
bool get(source, bool);
0 голосов
/ 12 января 2010

Если вы готовы платить за полиморфизм во время выполнения, вы можете сделать это ...

template <typename T>
class Interface
{
   virtual T get(Source const &s, T const &d) = 0;
};

class StringInterface : public Interface<std::string>
{
   virtual std::string get(Source const& s, std::string const& d);
};

// etc.

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

0 голосов
/ 12 января 2010

Объявите базовый класс (t) как абстрактный, чтобы никогда нельзя было создать экземпляр этого класса.

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