用于类与函数的C ++中的模板类型推导?

时间:2009-12-17 13:34:19

标签: c++ class function templates types

为什么自动类型推导仅适用于函数而不适用于类?

4 个答案:

答案 0 :(得分:17)

在特定情况下,您总是可以执行std::make_pair

template<class T>
make_foo(T val) {
    return foo<T>(val);
}

编辑:我刚刚在“The C ++ Programming Language,Third Edition”,第335页中找到了以下内容.Bjarne说:

  

请注意,类模板参数是   从未推断过。原因是   几个人提供的灵活性   一个类的构造函数会   很多人都不可能这样做   案件和更多的模糊不清。

这当然是非常主观的。在comp.std.c++中已经对此进行了一些讨论,并且共识似乎是没有理由不支持 。这是否是一个好主意是另一个问题......

答案 1 :(得分:9)

Kona meeting已经批准了构造函数(P0091R0)的模板参数推导,这意味着在C ++ 17中我们将能够编写:

pair p1{"foo"s, 12};
auto p2 = pair{"foo"s, 12};
f(pair{"foo"s, 12});

答案 2 :(得分:4)

如果是函数调用,编译器会从参数类型中推断出模板类型。例如std::max - 函数。编译器使用参数类型来推导模板参数。这并不总是有效,因为并非所有电话都是不明确的。

int a = 5;
float b = 10;

double result1 = std::min( a, b ); // error: template parameter ambigous
double result2 = std::min< double >( a, b ); // explicit parameter enforces use of conversion

在模板类的情况下,可能无法正常进行。以此类为例:

template< class T>
class Foo {
public:
    Foo();
    void Bar( int a );
private:
    T m_Member;
};

类型T永远不会出现在任何函数调用中,因此编译器根本没有提示,应该使用什么类型。

答案 3 :(得分:1)

我认为隐式类型转换仅适用于函数参数,因此编译器可以推导它以使函数调用成功。

但它怎么能推断出你想要什么类型的课程。

当我们有基于AI的编译器来阅读我们的想法时,我们必须等待4天。