2014-09-02 29 views
4

我覺得有一個基本上像std::array行爲,但由某些枚舉值索引的類相當方便。我想這是不是很難想象如何實現它,讓我們說這有這樣的簽名:重載std :: get爲枚舉索引數組

class enum_array <typename EnumT, typename ValueT, size_t N> 

在另一方面同時試圖實現所有的標準std::array關注功能我我們注意到爲這樣的類模板寫入超載std::get函數並不那麼容易。

首先,我認爲這是很自然的這個std::get有上述枚舉值作爲模板參數,因爲它的大部分問題出現:

1)如果我要定義這樣在類的外部功能我必須做這樣的事情:

namespace std { 
template <EnumT Index, typename EnumT, typename ValueT, size_t N> 
EnumT &get (enum_array<EnumT, ValueT, N> &val) 

但問題引起該EnumT仍是未知數,而確定的第一個模板參數,因此此模板實際上是病態的

如果我把EnumT Index放在第二個或更多參數列表的位置,那麼存在的問題是我不能真正指定這個參數,並且必須指定其他的東西,並且看起來不像正常std::get致電std::array

2)如果我定義get函數內部enum_array類爲好友功能一切都將只是一個事實,即那會被放置在同一個命名空間中的類enum_array屬於看似罰款。並把它放在namespace std不是最好的設計。

所以我的問題是:可以std::get與枚舉參數重載的方式,我提到這樣的類使用C++模板機制?

(想指出的是,這一問題引起了大多是出於好奇,畢竟std::get不是std::array在我看來,最有用的功能)

+1

我覺得你患有(模板非模型參數的類型被推導出來)這樣的(模板)之類的(而非常常見的)問題。因此,您必須爲每個枚舉類型指定一個函數(模板),例如'template auto get(..);','template auto get(..);'等等,或者您必須(手動)爲每個調用傳遞枚舉值的類型,àla'get (..);','get (..);' – dyp 2014-09-02 16:32:47

回答

5

你目前還不能。你想要的是Implicit Template Parameters。委員會喜歡這個想法,但希望看到提議的表示法與dyp提到的auto表示法的比較。我已經承諾11月的標準會議新草案。好的,我可以包括你的例子嗎?

+0

它肯定沒問題。儘管這裏有個答案,從技術上來說,從std中加載函數是不合法的,所以也許需要一些重新定義來精確地遵守標準。 – Predelnik 2014-09-02 17:35:13

+0

瞭解,但這似乎不是一個障礙。您可以使用'using'語句來確保'std :: get'和'myns :: get'參與重載解析。由於這有點鬆散,所以對於它無法處理的情況,將myns :: get委託給std :: get可能會更好。現在,如果你有一個模板可以調用'std :: get'它不會找到你的功能,但是如果它想要非標準的行爲,它應該調用除'std :: get'之外的東西。 – user2913094 2014-09-02 19:05:00