Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+中的模板类型推导+;对于类还是函数?_C++_Class_Function_Templates_Types - Fatal编程技术网

C++ C+中的模板类型推导+;对于类还是函数?

C++ C+中的模板类型推导+;对于类还是函数?,c++,class,function,templates,types,C++,Class,Function,Templates,Types,为什么自动类型推断只能用于函数而不能用于类?我认为隐式类型转换只适用于函数参数,这样编译器就可以推断它以使函数调用成功 但是它怎么能推断出你想要什么类型的课程呢 我们必须等待这样的一天,当我们有基于人工智能的编译器来读懂我们的思想时 在特定情况下,您可以像std::make\u pair: template<class T> make_foo(T val) { return foo<T>(val); } 模板 make_foo(T val){ 返回foo(val

为什么自动类型推断只能用于函数而不能用于类?

我认为隐式类型转换只适用于函数参数,这样编译器就可以推断它以使函数调用成功

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


我们必须等待这样的一天,当我们有基于人工智能的编译器来读懂我们的思想时

在特定情况下,您可以像
std::make\u pair

template<class T>
make_foo(T val) {
    return foo<T>(val);
}
模板
make_foo(T val){
返回foo(val);
}
< > >编辑:我在“C++编程语言,第三版”第335页找到了下面的内容。比亚恩说:

请注意,类模板参数是 从未推断过。原因是 由几个方面提供的灵活性 类的构造函数将使 这种推断在许多情况下是不可能的 更多的案例和模糊案例


这当然是非常主观的。在
comp.std.c++
中对此进行了一些讨论,一致认为没有理由不支持它。这是否是一个好主意是另一个问题…

对于函数调用,编译器从参数类型推断模板类型。例如-函数。编译器使用参数的类型来推断模板参数。这并不总是有效的,因为并非所有调用都是明确的

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
inta=5;
浮动b=10;
双结果1=std::min(a,b);//错误:模板参数不明确
双结果2=std::min(a,b);//显式参数强制使用转换
对于模板类,这可能并不总是可能的。以这个类为例:

template< class T>
class Foo {
public:
    Foo();
    void Bar( int a );
private:
    T m_Member;
};
模板
福班{
公众:
Foo();
空心钢筋(INTA);
私人:
清华大学成员;
};
类型T从未出现在任何函数调用中,因此编译器根本没有提示应该使用什么类型。

在模板中,构造函数的参数推断()已获得批准,这意味着在C++17中,我们将能够编写:

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

你是否谈论std::向量a(1,真)或关于
std::vector v=std::vector(1,true)?第一个将是“true”推断,而第二个将需要一个已知的参数。注意布尔向量显式专门化的复杂性。第一个,真演绎,这是不可能的吗?我刚刚发现Bjarne Stroustrups在语言中没有包含这一点。这就是我要问的,为什么你需要在函数中封装一个类,正如boost::bind中所做的那样,几个构造函数提供的灵活性不小于或大于几个重载提供的灵活性。因此,这并不总是可能的,但正如您所指出的,函数也不可能。所以这并不能真正解释为什么它不被支持。我不知道为什么它不被支持(一个尽力而为的解决方案是可以想象的),但问题是,如果可能的话。我想我回答了这个问题,所以我不理解反对票。我想他问的是为什么不可能,不是是否可能。-1据我所知,精神力量不是任何人工智能研究项目的一部分。另外,虽然我承认英语不是每个人的第一语言,但滥用“4”是不可原谅的。+1说等到编译人员能够“知道你想做什么”并且非常可靠的时候。。。这是一种可能性。只需在makefile中添加一个标志。无需人工智能-GCC7声称支持类模板的模板参数推断:所以请稍等片刻。;)