2014-06-24 17 views
5

Ví dụ, tôi có một lớpLàm thế nào để tạo danh sách khởi tạo ngầm chuyển đổi sang lớp?

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

private: 
    int m_i; 
    double m_d; 
}; 

và một chức năng với một cuộc tranh cãi Một

void f(A a); 

Và tôi có thể sử dụng danh sách initializer để gọi hàm

f(A{1, 3.14}); 

Làm thế nào để làm cho phiên bản đơn giản sau đây cũng hoạt động?

f({1, 3.14}); 
+4

Làm 'A {...}' không sử dụng danh sách khởi tạo, nó là [khởi tạo đồng bộ] (http://en.wikipedia.org/wiki/C++11#Uniform_initialization) và giống nhau khi thực hiện 'A (...)'. –

Trả lời

6

Cuộc gọi của hàm có danh sách bộ khởi tạo sẽ hoạt động. Bạn không nên làm gì đặc biệt. :)

Cuộc gọi sẽ không được biên soạn nếu hàm tạo có thông số chức năng explicit. Trong trường hợp này bạn phải sử dụng các cuộc gọi trước đó của hàm

f(A{1, 3.14}); 

sử dụng ký hiệu chức năng đúc danh sách initializer đến một đối tượng kiểu A.

+0

điều gì xảy ra nếu chúng ta có quá tải khác của hàm đó chấp nhận một đối tượng khác có cùng một hàm tạo? https://ideone.com/iN0uKW – Omid

+0

@xyz Sẽ có một sự mơ hồ. –

+0

vâng tôi biết, Thật kỳ lạ khi làm cho một trong những nhà xây dựng rõ ràng không hoạt động https://ideone.com/uFif5G – Omid

0

Nếu bạn có nhiều tình trạng quá tải của một hàm mà chấp nhận đối tượng với cùng một nhà xây dựng và bạn muốn f({1, 3.14}); gọi một trong số họ

có thể với một số chương trình meta

#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

Các vấn đề liên quan