返回使用boost.assign初始化的匿名tr1数组

时间:2011-11-28 20:44:08

标签: c++ arrays boost tr1 assign

好的,这适用于我的编译器(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 个答案:

答案 0 :(得分:3)

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测试;早期版本可能需要不同的专业化。)


您问题中的语法不是默认构造,而是值初始化。