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

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

【问题讨论】:

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

标签: c++ class function templates types


【解决方案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 所以再坚持一会儿。 ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-22
    • 1970-01-01
    • 2020-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多