Как проверить, является ли тип класса шаблона пустым?

Мне нужен способ проверить, является ли тип шаблонного класса пустым.

Вот моя попытка:

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? Я гуглил вопрос, но не смог найти ответ, поэтому я и задаю его здесь.

Заранее спасибо.

1

Решение

В 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или выделять часть кода, которая работает с ними, в отдельный специализированный шаблон класса.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]