2016-09-17 58 views
1

我想允許對我寫的容器類進行常量或非常量迭代。我的容器將元素存儲在非const引用的std::vector中(稱爲elements)。我使用Boost的transform iterator要做到這一點,如:在C++中將T從T轉換爲const T的函數

auto begin() const 
{ 
    return boost::make_transform_iterator 
     (elements.begin() 
     , to_const<std::reference_wrapper<ElementType>> 
     ); 
} 

在這裏我用一個簡單的函數模板,我寫信給T類型的對象轉換爲const T

template <typename T> 
std::add_const<T>::type to_const(T value) { return value; } 

我知道這是瑣碎寫,但我只是想知道是否已經有一個STL或Boost函數模板來做到這一點,類似於std::add_const,但作爲一個實際的功能。 (或者,如果有人知道更好的方法來將一個可變的向量懶散地轉換成一個常量向量,那會更好。)

回答

2

在C++ 17中,有一個<utility>模板函數可以做到這一點, std::as_const<T>,順便說一句,這(下)不是如何寫它。

template <typename T> 
std::add_const<T>::type to_const(T value) { return value; } 

您正在通過允許臨時值的值參數,並可能需要調用複製/移動構造函數;相反,使用lvalue參考(又名,對象不能是臨時的),如下原型:

template <typename T> 
constexpr typename std::add_const<T>::type& as_const(T& t) noexcept{ 
    return t; 
} 

template <typename T> 
constexpr std::add_const_t<T>& as_const(T& t) noexcept{ return t; } 
+0

完善。我忘記了constexpr和reference參數,這就是爲什麼我想要找到一個標準的實現。 :P –

+0

爲了完整性,應該說這*如果是'const'則允許臨時對象作爲參數。 –

+0

@ JohannesSchaub-litb,由於這不是轉發引用,因此只有在明確的模板參數如['std :: as_const (A())'**或... **'std :: as_const(static_cast (A()));'](http://coliru.stacked-crooked.com/a/77d58c9af7e711af)...但爲什麼有人甚至想這樣做? – WhiZTiM