テンプレート化されたクラスの型が無効かどうかを確認する方法が必要です。
これが私の試みです:
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 で動作しますか? 質問をグーグルで検索しましたが、答えが見つからなかったので、ここで質問します。
前もって感謝します。