Могут ли шаблоны C ++ проверить, была ли перегружена функция для данного типа? - PullRequest
2 голосов
/ 28 ноября 2010

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

template<typename T>
bool tobool(const T&){ throw Exception("Can't cast to bool");};
template<> bool tobool<bool>(const bool &value){ return value;}

Я знаю, что вы можете проверить наличие функций, как в здесь .

Есть ли шанс, как проверить, специализирован ли tobool?1009 *

Представьте, что я хочу сгенерировать isbool (), который возвращает true, если tobool () специализирован, и возвращает false, если нет.

Ответы [ 2 ]

3 голосов
/ 29 ноября 2010

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

template <typename T> 
struct ToBool {
   static bool tobool(const T&);
   static const bool specialized = false;
};

Другой вариант -определить tobool только в специализациях.Таким образом, ToBool<Foo>::tobool(f) не будет компилироваться для любых классов Foo, для которых ToBool не специализировался.

В качестве альтернативы tobool, вы можете использовать явные операторы преобразования, если у вас естьконтроль над классами, которые будут преобразованы.

class Foo {
public:
    operator bool();
    ...
};
...
    Foo f;
    if (f) ...

Если тип не имеет преобразования bool (ну, преобразование в числовой или указательный тип, оба из которых имеют стандартные преобразования в bool),Программа не скомпилируется.Вуаля, проверка времени компиляции для преобразования.

Если вы не хотите неявного преобразования в bool, вы можете определить оператор!и используйте двойной удар для явного преобразования (хотя это не так читабельно):

class Foo {
public:
    bool operator!();
    ...
};

...
    Foo f;
    if (!!f) ...
0 голосов
/ 28 ноября 2010

Ответ на ваш конкретный вопрос таков: нет, вы не можете проверить, использует ли T первичный или специализированный шаблон.Вопрос @Martin York очень хороший: с какой стати вы хотите это проверить?:)

...