問題を解決するためのタグディスパッチベースの方法は次のとおりです。
template<class T>
void doStuffHelper(const T& a, std::true_type can_copy_assign)
{
T x;
x=a;
printf("Hello\n");
}
template<class T>
void doStuffHelper(const T& a, std::false_type can_copy_assign)
{
printf("Goodbye\n");
}
template<class T>
void doStuff(const T& a)
{
return doStuffHelper( a, std::is_copy_assignable<T>() );
}
ここでは、動作するバージョンのみがコンパイルされます。の名前はcan_copy_assign
単に説明のために存在します。要点は、 に基づいてオーバーライドしstd::is_copy_assignable<T>()
、オーバーライド ディスパッチを使用して使用する実装を選択することです。
コードでは、if
ブロックは のようになりますif(true)
。まだコンパイルする必要があるブロックのelse
句。これは、使用されるメソッドが実行されなくても、有効でなければならないことを意味します。if
if(true)
タグ ディスパッチ ソリューションは、期待されるプロパティを持つ関数が、そのプロパティを使用するコードでコンパイルされるように配置します。
SFINAE を含む同様の方法を使用することもできますが、SFINAE には煩わしい複雑な問題がいくつかあるため、通常、可能であれば回避することが最善です。