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」が void である C_rule のオブジェクトを作成すると、2 つの変数「start_function_return_value」および「end_function_return_value」が void として宣言されているというコンパイラ エラーが生成されます。これらの関数の戻り値の型が void の場合、ルールの 'start' および 'end' 関数からの戻り値を格納する変数を作成しないようにしています (void 関数は明らかに何も返さないため)。そして、ご覧のとおり、その目的で typeid 演算子を使用しようとしていますが、機能していないようです。どうやら、start_function_type と end_function_type が void のときに if ステートメントがまだ入力されているようですが、その理由はわかりません。多分typeidはそうではありません' void で動作しますか? 質問をグーグルで検索しましたが、答えが見つからなかったので、ここで質問します。

前もって感謝します。

4

1 に答える 1

6

C++11 では、標準のstd::is_same<>型特性を使用して、2 つの型が同じかどうかを確認できます。

#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、それらを処理するコードの一部を別の特殊化されたクラス テンプレートに分解することです。

于 2013-03-02T15:33:19.107 に答える