2013-07-29 31 views
6

Ai cũng có thể cho tôi biết cách tốt nhất để thực hiện việc này.Kiểm tra int hoặc danh sách <int>

Nói, tôi có một hàm template như

template<typename ARGUMENT> 
void get_result(ARGUMENT &ag) 
{ 

// arg can be a single object of a particular object or list of objects of that particular class. 
//rest 

} 

Có cách nào mà tôi có thể kiểm tra xem & ag là một đối tượng duy nhất hoặc danh sách các đối tượng. Ngoài ra, với giao diện mẫu đã cho.

Không quan trọng nếu câu trả lời là do đặc tả mẫu theo cách nào đó bởi giao diện lớp học. Chỉ có điều là tôi không muốn chỉ định loại đối tượng hoặc loại danh sách.

Ví dụ: ag = int hoặc ag = list

CB

+4

Bạn specfically nghĩa danh sách, hoặc bất kỳ container cũ? – doctorlove

+0

Trên thực tế bất kỳ thùng chứa nào. Ngoài ra nó sẽ là tốt nếu tôi có thể chọn kiểu trả lại cho phù hợp. Nếu một đối tượng duy nhất đối tượng trả về và nếu đối số là một loại container chứa trả về. Mặt khác bên trong hàm, nó là cùng một thường trình cho các đối tượng khác ngoài việc lặp lại khi nó là một thùng chứa. Sẽ tốt hơn nếu tôi có mã ngắn nhất. –

+1

Về mặt khái niệm, việc tranh luận với chức năng của bạn là một thùng chứa hay không. Nếu bạn muốn kết hợp hai trong cùng một chức năng, nó có vẻ như thiết kế xấu. Mục đích của bạn là đối xử với việc vượt qua một phần tử duy nhất, một hộp chứa kích thước 1 có hiệu quả không? –

Trả lời

2

Bạn có thể disambiguate với một số đặc điểm loại:

#include <type_traits> 

template<typename T> 
T get_result(T arg) 
{ 
    return detail::get_result(arg, typename std::is_arithmetic<T>::type()); 
} 

namespace detail { 
    template<typename T> 
    T get_result(T arg, std::false_type /* dummy */) { } 

    template<typename T> 
    T get_result(T arg, std::true_type /* dummy */) {} 
} 

Xem here
đặc điểm này rõ ràng chỉ kéo ra các loại số, chứ không phải là một container . Loại trả về sẽ mất một số công việc. Có những ý tưởng để phát hiện một loại thùng chứa trong các câu trả lời herehere

+0

thnx. đây có vẻ là câu trả lời –

+0

@cowboy Rất vui được giúp đỡ. Nếu bạn thích nó, hãy xem xét việc đánh dấu nó http://stackoverflow.com/help/someone-answers – doctorlove

+0

Tôi đã làm điều đó. Phải không? –

7

Hmm, có lẽ tất cả những gì bạn cần là quá tải đơn giản?

template<typename ARGUMENT> 
void get_result(ARGUMENT& ag); 

template<typename ARGUMENT> 
void get_result(std::list<ARGUMENT>& ag); 

Edit:

Đọc ý kiến ​​của bạn, tôi có cảm giác bạn đang cố gắng overdesign chức năng của bạn và đưa nó cho nhiều trách nhiệm.

Tôi nghĩ bạn chỉ nên thực hiện tốt nhất với quá tải đầu tiên. Bất cứ khi nào bạn cần áp dụng hàm này cho toàn bộ phạm vi, hãy sử dụng for_each.

+0

Điều này có thể hoạt động tốt. Tuy nhiên tôi muốn có một cái gì đó như, ARGUMENT :: iterator itr = ag.bắt đầu() sau khi kiểm tra nếu đối số là từ một đối tượng chứa và áp dụng cùng một thói quen như đối với các đối tượng duy nhất. Vì vậy, nếu tôi có thể có nó trong một chức năng sẽ tuyệt vời. –

+0

@cowboy: Bạn có thể đạt được điều đó bằng cách xử lý vùng chứa không phải là vùng chứa với một phần tử. Nhưng điều đó có thể thực sự hiệu quả hơn. – MSalters

1

Bạn có ý nghĩa này không?

template<typename ARGUMENT> 
void get_result(ARGUMENT &ag) 
{ 
    std::cout<<typeid(ARGUMENT).name(); //Check the value 

/*This returns a name of the type in question. 
It may satisfy your criteria.*/ 
} 
//Header :#include <typeinfo> 

Vì vậy,

int x=12; 
list <int> l; 
get_result<list<int>>(l); // Outputs: St4listIiSaIiEE 

get_result<int>(x); //Outputs: i 
+0

Thnx. Tôi thà thích một giải pháp mà không đánh máy. –

1

SFINAE:

template<typename T> 
T get_result(T arg, typename T::value_type* = 0) 
{ 
    // Container. 
} 

template<typename T> 
T get_result(T arg, ...) 
{ 
    // Not a container. Vararg overloads rank lower in overload resolution. 
} 
+0

Nhưng điều này sẽ không xảy ra nếu các cuộc tranh cãi bổ sung vô nghĩa được cung cấp? –

+0

@NeilKirk: Trong trường hợp đó, hãy bọc nó trong một chi tiết 'không gian tên' (xem câu trả lời của bác sĩ) – MSalters

+0

@MSalters Thnx. sẽ kiểm tra điều này. –

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