2

関数テンプレートの明示的なテンプレート引数は、些細なコードのコンテキストであっても、私にとって何度も驚きの源です。そのようなコードはアンチパターンと見なされるべきですか? 一部の開発者は、他の StackOverflow スレッドでこれを仮定しています。

次のコードでは、適切な関数オーバーロードが見つからないことを示すエラーがコード位置 (1) でコンパイラによって報告されます。コンパイラがあいまいさを検出したとしてもそれほど驚かなかったでしょうが、そうではありません。ヒントはありますか?gcc 4.6.2 を使用しています

編集:私は解決策を探していません。解決策の例は、cppreference に記載されています。説明を探しています。

#include <iostream>
#include <tuple>
#include <type_traits>

using namespace std;

template<typename T, size_t N = 1>
//typename enable_if<integral_constant<bool, N==1>::value, ostream>::type &
ostream & operator << (ostream& stream, tuple<T> const & t)
{
        return stream << get<0>(t) << endl;
}

template<typename ...T, size_t N = sizeof...(T)>
//typename enable_if<integral_constant<bool, N!=1>::value, ostream>::type &
ostream & operator << (ostream& stream, tuple<T...> const & t)
{
        operator << <T...,N-1> (stream, t); // (1) compile error
        return stream << get<N-1>(t) << endl;
}

int main ()
{
        auto t = make_tuple ("hallo", 1L, 1.1);
        cout << t << endl;
}
4

1 に答える 1