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

Posted

技术标签:

【中文标题】C++中类与函数的模板类型推导?【英文标题】:Template type deduction in C++ for Class vs Function? 【发布时间】:2010-12-27 16:01:15 【问题描述】:

为什么自动类型推导只能对函数而不是类?

【问题讨论】:

你说的是std::vector a(1, true);还是std::vector<auto> v = std::vector<bool>(1, true);?第一个将是“真实”的演绎,而第二个将需要一个已知的论点。注意 bool-vector 显式特化的复杂性。 第一个,真正的演绎,不可能吗? 我刚刚发现 Bjarne Stroustrups 的理由是不将其包含在语言中。 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

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

编辑:我刚刚在第 335 页的“C++ 编程语言,第三版”中找到了以下内容。Bjarne 说:

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

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

【讨论】:

这就是我要问的,为什么你需要将一个类包装在一个函数中,就像他们在 boost::bind 中所做的那样 几个构造函数提供的灵活性不亚于或超过几个重载提供的灵活性。【参考方案3】:

在函数调用的情况下,编译器从参数类型推导出模板类型。例如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从不出现在任何函数调用中,所以编译器根本没有提示,应该使用什么类型。

【讨论】:

所以它并不总是可能的,但是,正如你所指出的,它也不是函数。所以这并不能真正解释为什么它不受支持。 我不知道为什么不支持它(可以想象一个尽力而为的解决方案),但问题是,如果可能的话。我想我回答了这个问题,所以我不理解反对票。 我想他问的是为什么不可能,而不是是否有可能。【参考方案4】:

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

但是它怎么能推断出你想要它类的类型。

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

【讨论】:

-1 据我所知,精神力量不是任何人工智能研究计划的一部分。另外,虽然我承认英语不是每个人的第一语言,但滥用“4”是不可原谅的。 +1 说等到编译器可以“知道您要做什么”并且非常可靠的日子……这是一种可能性。只需在 makefile 中添加一个标志。 不需要 AI - GCC7 声称支持类模板的模板参数推导:gcc.gnu.org/projects/cxx-status.htmlopen-std.org/jtc1/sc22/wg21/docs/papers/2016/p0091r3.html 所以再坚持一会儿。 ;)

以上是关于C++中类与函数的模板类型推导?的主要内容,如果未能解决你的问题,请参考以下文章

模板类与抽象类

C++_模板类与类型萃取技术

c++ stl函数模板类型推导

深入了解C++:auto与函数模板之推导规则辨析

C++ 提高教程 -模板 类模板与函数模板区别

推导返回类型模板 C++