2016-09-17 2 views
1

Я хочу разрешить постоянную или не постоянную итерацию над классом контейнера, который я написал. Мой контейнер хранит элементы в std::vector ссылок не const (назовите это elements). Я использую подталкивание-х transform iterator, чтобы сделать это, например:Функция для преобразования из T в const T в C++

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>, и BTW, это (ниже) не то, как его написать.

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 и ссылочные параметры, поэтому я хотел найти стандартную реализацию. : P –

+0

Для полноты следует сказать, что это * позволяет * допускать временные, если они являются 'const', в качестве аргументов. –

+0

@ JohannesSchaub-litb. Поскольку это не ссылка на пересылку, временные файлы могут приниматься только в том случае, если заданы явные аргументы шаблона, такие как ['std :: as_const (A())' ** или ... ** 'std :: as_const (static_cast (A()));] (http://coliru.stacked-crooked.com/a/77d58c9af7e711af) ... Но почему кто-то даже захочет это сделать? – WhiZTiM

Смежные вопросы