私の質問に複数の選択肢からコンストラクタを選択するSFINAEを使用する方法この問題を拡張したものです。クラステンプレートのパラメータ型がデフォルトコンストラクタブルかどうかに応じてコンストラクタの動作を変更したいと思います。これを行うための最善の方法は、2つのコンストラクタを同じ使用法で使用することですインスタンス化ごとにコントラクターの両方のバージョンがint otherN
にテンプレート化されているのに対し、私はenable_if
で選択的に有効にしようとしていないと、コンストラクターのどちらのバージョンもテンプレート関数ではないため、私のケースも異なります。はC++ 11
上記の質問への受け入れ答えのコメントは以下の最小限の例を作成するために私を導いた、this siteに私を導いた:私は最初をコメントアウト場合
#include <iostream>
#include <type_traits>
namespace detail {
enum class enabler {};
enum class disabler {};
}
template <typename Condition>
using EnableIf = typename std::enable_if<Condition::value, detail::enabler>::type;
template <typename Condition>
using DisableIf = typename std::enable_if<!Condition::value, detail::disabler>::type;
template<typename T>
struct A {
T data;
// Valid if T is default-construtible; SFINAE otherwise
template<EnableIf<std::is_default_constructible<T>>...>
A() { std::cout << "Data defaulted" << std::endl; }
// Valid if T is *not* default-constructible; SFINAE otherwise
template<DisableIf<std::is_default_constructible<T>>...>
A() : data(0) { std::cout << "Data zeroed" << std::endl; }
};
// struct which is not default-constructible
struct B {
B() = delete;
B(int) {}
};
int main()
{
A<int> x; // int is default-constructible
A<B> y; // class B is not default-constructible
return 0;
}
私は(-std=c++11
で)これをコンパイルすることができますxまたは2番目のコンストラクタの宣言とyの宣言を使用して、私はどちらもしたくないのですが、コンパイラはtype
という名前の型がないと文句を言うと、std::enable_if<false, >
にあります。
this質問への回答は、同様の問題に別のアプローチをとっていますが、アプローチを組み合わせて動作することができる十分な要素はわかりません。
[ほぼ静的-IF(https://rmf.io/cxx11/almost-static-if)リンクを更新する必要があります。 – tukra
修正済み、ありがとう – user1476176