Возвращение анонимного массива tr1, инициализированного с boost.assign - PullRequest
2 голосов
/ 29 ноября 2011

Хорошо, это работает на моем компиляторе (vs2008), но я пытаюсь выяснить, делаю ли я что-то нестандартное. Вот тривиальный пример того, что я делаю:

std::tr1::array<int, 3> OneTwoThree() {
    return boost::assign::list_of(1)(2)(3).to_array(std::tr1::array<int, 3>());
}

Я обманываю тот факт, что адаптер to_array на самом деле не использует аргумент, который вы передаете ему, он просто использует его для определения типа. Однако примеры показывают, что он используется более примерно так:

std::tr1::array<int, 3> a = boost::assign::list_of(1)(2)(3).to_array(a);

Любые идеи о том, является ли просто бросить инициализированный значением массив в to_array, это кошерный? Есть ли более чистый способ сделать это?

1 Ответ

3 голосов
/ 29 ноября 2011

Все функции-члены to_... принимают аргумент исключительно с целью помочь с выводом аргумента шаблона, так что да, передавая инициализированный значением экземпляр того же типа, который вы хотите использовать в качестве возвращаемого типа безопасен, хотя и неоправданно неэффективен.

Однако функции-члены to_... существуют только для помощи сломанным компиляторам, которые должным образом не поддерживают шаблонные операторы преобразования - почему вы используете их в первую очередь? Чистый синтаксис был бы просто:

boost::array<int, 3> OneTwoThree() {
    return boost::assign::list_of(1)(2)(3);
}

Обратите внимание, что я использовал boost::array<> здесь, а не std::tr1::array<>; причина в том, что библиотека Boost.Assign не знает (пока) о стандартных библиотеках TR1 / C ++ 11 и поэтому не специализируется должным образом на std::array<> или std::tr1::array<>. Чтобы самостоятельно добавить эту специализацию и, следовательно, заставить приведенный выше код работать с std::tr1::array<>, добавьте следующий код после , включая заголовки Boost.Assign:

namespace boost { namespace assign_detail {

template<typename T, std::size_t sz>
type_traits::yes_type assign_is_array(std::tr1::array<T, sz> const*);

}}

(Примечание: протестировано только с Boost 1.48; в более ранних версиях может потребоваться другая специализация.)


Синтаксис в вашем вопросе не конструкция по умолчанию, это инициализация значения.

...