次のような関数を作成したい:
template < typename Other, typename Func, typename T, typename ...Rest >
void visit( Other &&other, Func &&visitor )
{
// Wrap "visitor" and "other" with "std::forward" calls
visitor( make_object<T>(other) );
visit<Other, Func, Rest...>( other, visitor );
}
問題は、「Func」がリスト内のすべてのタイプをサポートしていない可能性があることです。その場合、コンパイラは最初の悪いタイプで失敗します。私はそれを望んでいません。代わりに、デフォルトのアクションを実行したいです(私の場合は、何もしません)。
template < typename Other, typename Func, typename T, typename ...Rest >
void visit( Other &&other, Func &&visitor )
{
// Wrap "visitor" and "other" with "std::forward" calls
if ( Func-can-support-T-either-directly-or-by-converting-it )
visitor( make_object<T>(other) );
else
; // might be a throw or a logging instead
visit<Other, Func, Rest...>( other, visitor );
}
2 つのオーバーロードされた補助関数を作成できると思います。1 つstd::true_type
は互換性テストに基づいており、もう 1 つはstd::false_type
. しかし、どうすればテストを作成できますか?
(より良いタイトルや追加のタグの提案を歓迎します。)