2012-02-23 10 views
7

Tôi muốn quá tải operator<< cho các mảng tùy ý, sao cho mã cout << my_arr sẽ hoạt động. Trước tiên, tôi đã cố gắng quá tải thông số thứ hai của operator<< trên const T (&arr)[N], trong đó TN là thông số mẫu. Nhưng kiểm tra mã cho thấy một tác dụng phụ: const char[] cũng phù hợp với đặc tả loại, và xung đột quá tải mới với một trong những quy định trong lớp dòng. Mã ví dụ:Toán tử quá tải << đối với mảng

#include <cstddef> 
#include <iostream> 

template<typename T, std::size_t N> 
std::ostream& operator<<(std::ostream& os, const T (&arr)[N]) 
{ 
    /* do stuff */ 
    return os; 
} 

int main() 
{ 
    std::cout << "noooo\n"; /* Fails: ambiguous overload */ 
} 

Nhà điều hành in mảng này vẫn có thể được triển khai?

+0

Tôi không nghĩ rằng N sẽ chuyển giao tốt trong nhiều trường hợp. 'void f (int arr [], size_t N) {cout << arr; } ' –

+0

nếu bạn muốn có thư viện bên ngoài tại sao không chỉ sử dụng http://www.boost.org/doc/libs/1_48_0/doc/html/boost_lexical_cast.html – pyCthon

+1

@Captain:' arr' thực sự có loại 'int * 'trong trường hợp đó, vì vậy nó sẽ không phù hợp với tình trạng quá tải đó. –

Trả lời

5

chắc:

template<typename T, std::size_t N> 
typename std::enable_if<!std::is_same<T, char>::value, std::ostream&>::type 
operator<<(std::ostream& os, const T (&arr)[N]) 
{ 
    // ... 
} 

này sẽ vô hiệu quá tải khi Tchar sử dụng SFINAE.

Đối với C++ 03, Boost có enable_ifis_same. Hoặc chỉ cần cuộn của riêng bạn:

template<class T, class U> struct is_same { 
    enum { value = false }; 
}; 
template<class T> struct is_same<T, T> { 
    enum { value = true }; 
}; 

template<bool, class T> struct enable_if {}; 
template<class T> struct enable_if<true, T> { 
    typedef T type; 
}; 
+0

bất kỳ giải pháp C++ 03 nào? –

+1

@ Mr.Anubis: Sử dụng 'boost :: enable_if' và' boost :: is_same' để thay thế. Nếu bạn không muốn Boost, hãy tự thực hiện chúng, hai thứ này là tầm thường. –

+0

@GeorgFritzsche: Bạn nói đúng. Nhưng phải không? Tôi đoán rằng 'const T (&) []' có thể liên kết với một mảng không phải const, do đó, yeah, nó là tốt như bằng văn bản. Đó là cấp độ sâu hơn của 'const' mà không thể được thêm ngầm. –