如何使初始化列表隐式转换为类?

时间:2014-06-24 18:48:44

标签: c++ initializer-list

例如,我有一个班级

struct A
{
    A(int i, double d) {...}

private:
    int m_i;
    double m_d; 
};

和带参数A的函数

void f(A a);

我可以使用初始化列表来调用函数

f( A{1, 3.14} );

如何使以下简单版本也有效?

f( {1, 3.14} );

2 个答案:

答案 0 :(得分:6)

使用初始化程序列表调用该函数将起作用。你应该什么都不做。:)

如果构造函数具有函数说明符explicit,则不会编译调用。在这种情况下,您必须使用以前的函数调用

f( A{1, 3.14} );

使用将初始化列表转换为类型A的对象的函数表示法。

答案 1 :(得分:0)

如果你有一个函数的多次重载,它接受具有相同构造函数的对象,你想要f( {1, 3.14} );调用其中一个

可以使用一些元编程

#include <string>
#include <type_traits>
#include <iostream>

struct A{
     A(int ,double) {}
};

struct B{
     B(int ,double) {}
};

template<class T=A>
void f(T a,
       typename std::enable_if<std::is_same<T,A>::value>::type* = 0 ){
    std::cout<<"In f(A a)\n";
}

void f(B b){std::cout<<"In f(B b)\n";}

int main(int argc, char**argv)
{
    f({1,2}); //It's not ambiguity anymore and calls f(B a)
    f(A{1,2});//call f(A a)
    f(B{1,2});//call f(B b)
    //f(2); error
}

live