15

テンプレート化された関数の部分的な仕様が C++ 標準の一部であるかどうか、またはこれがコンパイラ固有のものであるかどうかを調べようとしています。

部分的な指定とは、コンパイラが推測できない型のみを指定することを意味します。したがって、3 つの型を取るテンプレート関数 'f' があり、そのうちの 1 つがパラメーターで使用され、推定できる場合、次の形式で 'f' を呼び出すことができます。f<type, type>(parameter)

次に例を示します。

#include <iostream>
#include <tuple>
#include <string>

template<class A, class B, class C>
std::tuple<A, B> test(C c)
{
    // do something based on c, return tuple with types A and B
    return std::make_tuple(A(), B());
}

int main(void)
{
    // I expected I would have to use this form.  Specify all parameters.
    std::tuple<int, int> value3 = test<int, int, int>(5);

    // Here, I only specified the return value types, did not specify the parameter type, yet it compiles.
    auto value1 = test<int, int>("c-string");

    // Similar example here.  Return types specified, parameter type deduced.  Compiles fine.
    auto value2 = test<std::string, int>(42);

    return 0;
}

これを g++ 4.5.3、g++ 4.6.3、VS2010、および VS2012 でテストしました。コンパイラによって広くサポートされているように見えるので、標準の一部であると確信していますが、誰でもそれを確認できますか? これが機能する理由を説明するリソースへのリンクまたはポインタを誰かが持っていますか?

4

1 に答える 1

15

C++03 標準状態の段落 14.8.1.2

「推定できる末尾のテンプレート引数 (14.8.2) は、明示的なテンプレート引数のリストから省略される場合があります。」

于 2012-11-25T19:41:53.033 に答える