Мне нужен способ проверить, является ли тип шаблонного класса пустым.
Вот моя попытка:
template <typename target_type, typename start_function_type, typename end_function_type> class C_rule {
public:
//...
void setIntoEffect(bool true_or_false) {
if (true_or_false == true) {
for (size_t i = 0; i < targets.size(); i++) {
if (typeid(start_function_type) != typeid(void)) {
start_function_type start_function_return_value = enforceOnTarget(targets.at(i));
}
else {
enforceOnTarget(targets.at(i));
}
}
}
else if ((true_or_false == false) && (is_in_effect == true)) {
for (size_t i = 0; i < targets.size(); i++) {
if (typeid(end_function_type) != typeid(void)) {
end_function_type end_function_return_value = removeFromTarget(targets.at(i));
}
else {
removeFromTarget(targets.at(i));
}
}
}
is_in_effect = true_or_false;
}
protected:
//...
private:
//...
};
Однако это приводит к ошибке компилятора с жалобой на то, что две переменные «start_function_return_value» и «end_function_return_value» объявляются недействительными, когда создается объект C_rule с типами «start_function_type» и «end_function_type» void. Я пытаюсь предотвратить создание переменной для хранения возвращаемого значения из функций ‘start’ и ‘end’ для правила, если тип возврата этих функций void (поскольку функции void, очевидно, ничего не возвращают). И, как вы можете видеть, я пытаюсь использовать оператор typeid для этой цели, но, похоже, он не работает. По-видимому, оператор if все еще вводится, когда start_function_type и end_function_type недействительны, и я не знаю почему. Может быть, typeid не работает с void? Я гуглил вопрос, но не смог найти ответ, поэтому я и задаю его здесь.
Заранее спасибо.
В C ++ 11 вы могли бы использовать стандарт std::is_same<>
наберите trait, чтобы проверить, совпадают ли два типа:
#include <type_traits>
// ...
bool same = std::is_same<T1, T2>::value;
В вашем случае это может стать:
bool same = std::is_same<start_function_type, void>::value;
Однако это не решит вашу проблему, потому что if
утверждение не время компиляции (Статический) if
: обе ветви if
Заявление все равно придется составлять.
Что вы могли бы сделать, это специализировать шаблон вашего класса для случаев, когда start_function_type
или же end_function_type
является void
или выделять часть кода, которая работает с ними, в отдельный специализированный шаблон класса.
Других решений пока нет …