3

我需要一种方法来检查模板类的类型是否为无效。

这是我的尝试:

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_type”和“end_function_type”为无效的 C_rule 对象时将两个变量“start_function_return_value”和“end_function_return_value”声明为无效。我试图阻止创建一个变量来存储规则的“开始”和“结束”函数的返回值,如果这些函数的返回类型是 void(因为 void 函数显然不返回任何内容)。而且,如您所见,我正在尝试为此目的使用 typeid 运算符,但它似乎不起作用。显然,当 start_function_type 和 end_function_type 为 void 时,仍在输入 if 语句,我不知道为什么。也许 typeid 没有 t 与 void 一起工作?我用谷歌搜索了这个问题,但找不到答案,所以我在这里问这个问题。

提前致谢。

4

1 回答 1

6

在 C++11 中,您可以使用标准std::is_same<>类型特征来验证两种类型是否相同:

#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_typeor end_function_typeis的情况,void或者将处理它们的代码部分分解为单独的专门类模板。

于 2013-03-02T15:33:19.107 回答