2014-06-24 86 views
5

例如,我有一個類如何使初始化程序列表隱式轉換爲類?

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

private: 
    int m_i; 
    double m_d; 
}; 

和函數的自變量一

void f(A a); 

而且我可以使用初始化列表來調用函數

f(A{1, 3.14}); 

如何使以下簡單版本也適用?

f({1, 3.14}); 
+4

做'A {...}'沒有使用初始化列表,它是[統一初始化](http://en.wikipedia.org/wiki/C++11#Uniform_initialization)並且是相同的做'A(...)'。 –

回答

6

該函數與初始化列表的調用將工作。你不應該做任何特殊的事情。:)

如果構造函數具有函數說明符explicit,則不會編譯該調用。在這種情況下,你有如果您有接受對象函數的多個超負荷使用使用鑄造初始化列表類型爲A.

+0

如果我們有另一個接受具有相同構造函數的對象的函數的重載,該怎麼辦? https://ideone.com/iN0uKW – Omid

+0

@xyz會有一個含糊之處。 –

+0

是的,我知道,甚至讓其中一個構造函數顯式不起作用,這很奇怪https://ideone.com/uFif5G – Omid

0

的對象的功能符號功能

f(A{1, 3.14}); 

以前的通話用相同的構造,並且希望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

相關問題