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