C++でテンプレートを使用していくつかの魔法を実行しています。特定の戻り値の型を持つ関数型をとるC++テンプレート関数
このケースでは、List
タイプとデータを含むListElement
タイプのナイーブな汎用リスト実装を作成しました。
私はすでに任意の引数リストを持つリストに格納された型の任意のメンバ関数型をとり、指定されたリスト内の各要素に対してそのメンバ関数を呼び出す引数:
問題は、呼び出された関数の戻り値に「反応」できないことです。私は.map
機能を実装したくはありませんが!
今、コールが "true"を返してから停止するまで、リスト内の値に対して関数を呼び出す "for each call until"を実装したいと思います。そのためには、テンプレートパラメータとして挿入された関数を、ブール値を返す任意の型の関数に限定する必要があります。私は、コンパイラが文句を停止するまでの周りに型指定されたと、この得た:ここで何が起こっている
template<bool (*function), typename ... arguments>
void for_each_call_until(arguments ... args)
{
for(ListElement * current = this->first; current != nullptr; current = current->next)
{
if((current->value->*function)(args ...)) break;
}
}
、これは正しい方法で、そうでない場合、正しい方法は何ですか?
EDIT:std :: namespaceの関数を使用することをお勧めする人もいます。これらの小さなトレーニングセッションでは、stdを避けようとしています:: std ::を使用したいと思うようなペストすべての
#include <type_traits>
#include <utility>
template<typename T> struct is_bool;
template<> struct is_bool<bool> { typedef int value; };
template<typename function, typename ... arguments>
void for_each_call(function call, arguments && ... args)
{
typedef decltype(call(std::forward<arguments>(args)...)) ret_type;
typedef typename is_bool<ret_type>::value x;
call(std::forward<arguments>(args)...);
}
bool foo(int, int) {} // Compiles
// int foo(int, int) {} // Does not compile
int main()
{
for_each_call(foo, 4, 2);
return 0;
}
ないソリューションが、迅速かつ汚いです(current-> value-> * call)(args)の戻り値をbooleanローカル変数に代入することです。関数が実際にブール値を返さない限り、この代入はコンパイルに失敗します。したがって、実際にはブール値を返す関数だけを受け入れるように関数を制限します。私が正しく思い出すと、結果のコンパイルエラーは実際にはかなり有益です。「<間違った戻り値の型>をブール値に変換できません。 –
この方法は、関数がintを返す場合にも機能しますが、これは間違っています。 –
さて、私たちはC++について、Boolの背後にあるセマンティクスと戻り値の型としてintを考えています。 – salbeira