【问题标题】:type inference when using templates使用模板时的类型推断
【发布时间】:2012-08-30 08:36:31
【问题描述】:

所以这就是我想做的事情:我使用std::pair,但我肯定也想使用元组或几乎任何类型的模板来做同样的事情。分配对变量时,我需要输入如下内容:

T1 t1;
T2 t2;
std::pair<T1,T2> X;
X = std::pair<T1,T2> (t1, t2);

有没有办法在创建新对时省略第二个 &lt;T1,T2&gt;,让编译器猜测,或者使用 X 的类型(我显然试图创建一个 pair&lt;T1,T2&gt;)或 t1 和 @987654326 @ 的类型(我正在用 T1 对象和 T2 对象构建一对,我想要的一对有可能是 pair&lt;T1,T2&gt; 类型的)?

【问题讨论】:

    标签: c++ templates types inference


    【解决方案1】:

    是的,但是模板参数推导仅适用于函数模板,不适用于类模板的构造函数。为此,库提供了一个函数:

    X = std::make_pair(t1, t2);
    

    在 C++11 中,对和元组可以从初始化列表中初始化和赋值:

    X = {t1, t2};
    

    auto 可用于从初始化程序中自动指定类型,因此您根本不需要指定模板参数:

    auto X = std::make_pair(t1, t2);
    

    【讨论】:

    • 你知道构造函数不允许模板参数推导的原因吗?
    • @Hephaestos:我不知道原因;但我认为在一般情况下推断它们可能非常困难,如果不是不可能的话,因为不同的类模板特化可以有不同的构造函数集。不过,这只是一个猜测,
    【解决方案2】:

    是的,使用std::make_pair

    std::pair<T1,T2> X;
    // some code
    X = std::make_pair( t1, t2 );
    

    或者,如果你可以直接初始化它:

    std::pair<T1,T2> X = std::make_pair( t1, t2 ); // OR, even better:
    std::pair<T1,T2> X( t1, t2 ); 
    

    对于 C++11,初始化更好:

    auto X = std::make_pair( t1, t2 );
    

    赋值相同:

    X = std::make_pair( t1, t2 );
    

    但也可能是:

    X = { t1, t2 };
    

    【讨论】:

    • OP 分配给X,而不是复制初始化,所以auto 不适用(但了解一下肯定有用)。
    • 谢谢,正如我所料,答案就在我的眼皮底下:D
    • 我们可以使用初始化列表进行赋值吗?
    • @Hephaestos - 是的,在 C++11 中,对于 std::pair,正如我所写的那样。
    • @Hephaestos - 如果您的编译器不支持它,请使用std::make_pair,如我的回答开头所示。
    【解决方案3】:
    std::pair<T1,T2> X = std::make_pair(t1, t2);
    

    C++11

    std::pair<T1, T2> X = {t1, t2};
    

    C++11

    auto X = std::make_pair(t1, t2);
    

    对于std::tuple,有std::make_tuple

    【讨论】:

    • 为什么不std::pair&lt;T1,T2&gt; x(t1, t2);?这对于 pre C++11 也应该没问题。
    • @Nobody 好吧,OP 分配给X,这个答案都是关于声明和初始化的,这在这里有点无关紧要。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    相关资源
    最近更新 更多