2015-10-20 65 views
4

當我們有兩個操作符用於輸出對象和這些對象的數組,並嘗試輸出常量對象數組時,會涉及到對象的操作符。有沒有辦法迫使數組的運算符與常量對象的C數組一起工作?常量指針和常量數組的輸出

樣品的編號:

#include <iostream> 
#include <cstddef> 

using std::size_t; 

namespace nm 
{ 
    struct C { int i; }; 

    template <size_t N> 
    using c_c_array = C[N]; 

    inline std::ostream& operator << (std::ostream& lhs, C const*) { return lhs << "1\n"; } 

    template <size_t N> 
    inline std::ostream& operator << (std::ostream& lhs, c_c_array<N> const&) { return lhs << "2\n"; } 

} 

int main() 
{ 
    nm::C c{1}; 

    nm::C arr[5]; 

    nm::C const c_const{1}; 

    nm::C const arr_const[5] {{1}, {1}, {1}, {1}, {1}}; 

    std::cout << &c // 1 - ok 
      << arr // 2 - ok 
      << &c_const // 1 - ok 
      << arr_const; // 1 --ups 

    return 0; 
} 

輸出:1 2 1 1

附加地,操作者2在我的情況下輸出使用1。

+1

添加初始化到你的代碼,使人們停止回答錯誤的問題,即'c_const {};'和'arr_const [5] {};' – Rostislav

+0

不要緊,它是如何inicialized在所有的問題。如果它是非官方的或官方的,那麼運營商1將被呼叫。這僅僅是一個例子,我沒有用這個常數,只是爲了說明運營商叫做 –

+0

的命令。你看到人們給你的答案嗎?這是你正在尋找什麼?.. – Rostislav

回答

1

我會做類似下圖所示的事情。如果有人知道更好的解決方案,請寫下來。

#include <iostream> 
#include <cstddef> 
#include <type_traits> 

using std::size_t; 

namespace nm 
{ 
    struct C { int i; }; 

    template <size_t N> 
    using c_c_array = C[N]; 

    template<typename T> 
    inline 
    std::enable_if_t<std::is_same<T, C*>::value || std::is_same<T, C const*>::value, 
    std::ostream&> 
    operator << (std::ostream& lhs, T const&) { return lhs << "1\n"; } 

    template <size_t N> 
    inline std::ostream& operator << (std::ostream& lhs, c_c_array<N> const&) { return lhs << "2\n"; } 

} 

int main() 
{ 
    nm::C c{1}; 

    nm::C arr[5]; 

    nm::C const c_const{1}; 

    nm::C const arr_const[] {1,2,3,4,5}; 

    std::cout << &c // 1 - ok 
      << arr // 2 - ok 
      << &c_const // 1 - ok 
      << arr_const; // 1 --ups 

    return 0; 
} 
1

根據該草案標準N45278.5/P7.3初始化器[dcl.init]重點礦山):

  • 否則,不執行初始化。

如果程序要求 一個常量限定類型T的對象的默認的初始化,T 應是一個類的類型與用戶提供的默認的構造

因此,您必須爲class C定義默認構造函數以解決此問題。