デフォルトテンプレート引数を持つ関数テンプレートのオーバーロード解決の仕組みが分からないです。
以下コードで
template <class T, typename enable_if<is_class<T>>::type>
という形ではなく、
template <class T, typename enable_if<is_class<T>>::type = nullptr>*
とするのはインスタンス化前のシグニチャが異なる型であれば、それらの関数は異なるシグニチャとみなされるからオーバーロードできると本には記述されているのですが、意味が分からないです。
なぜnullptrを仮引数にいれただけで2つの関数のシグニチャが異なる型とみなされるのでしょうか?(それともデフォルトテンプレート引数を入れたから関数のシグニチャが異なる型とみなされた?どっちなんでしょうか)
これってデフォルトテンプレート引数いれることによって関数の引数が1つになったり2つになったりするからってことなんでしょうか?
でも通常の関数はデフォルト引数の違いでオーバーロードは発生しないですよね。
テンプレートの時は特別とか?
分かんないです。
お力添えお願いいたします。
struct is_class_impl { template <class T> static std::true_type check(int T::*) {}; template <class T> static std::false_type check(...) {}; }; template <class T> struct is_class : public decltype(is_class_impl::check<T>(nullptr)) {}; template <class T, typename enable_if<is_class<T>>::type* = nullptr> void check(T value) { std::cout << "1" << std::endl; } template <class T, typename disable_if<is_class<T>>::type* = nullptr> void check(T value) { std::cout << "2" << std::endl; }
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/01/30 10:31