C++中的部分模板函数规范是如何工作的?

15

我正在尝试确定模板函数的部分指定是否是C++标准的一部分,还是这仅仅属于编译器特定的功能。

所谓部分指定,指的是仅指定编译器无法推导出来的类型。例如,如果我有一个接受3种类型的模板函数"f",并且其中一个用在参数中可以被推导出来,那么我可以使用以下形式调用"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进行了测试。由于这似乎得到了编译器的广泛支持,我打赌这是标准的一部分,但有人可以确认吗?是否有任何链接或指向可能解释为什么这样做的资源?


你没有解释为什么你认为这不起作用。这里实际上没有任何问题。无论如何,你正在谈论参数推导,这显然并不新颖。 - Lightness Races in Orbit
似乎你正在寻找这个:http://cpp0x.centaur.ath.cx/temp.deduct.call.html - yonilevy
没错,yonilevy,就是这样。谢谢。 - James Freeman
1个回答

15

C++03标准的第14.8.1.2段规定:

“可以通过模板参数推导(14.8.2)确定的尾随模板参数可以从显式模板参数列表中省略。”


这就是我在寻找的确认,谢谢。 - James Freeman
为了给这个问题增加一些变化:如果模板参数在参数列表的中间,如果它们可以从前面的参数推导出来,但是后续的参数必须明确指定,那么有没有办法推导出它们呢? - haelix
我的意思是像OP的代码一样,但如果函数声明为 template<class A, class C, class B> std::tuple<A, B> test(C c) -- 也许写成这样 test<int, /*这里什么都不用写*/, int> (3.14) - haelix

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接