好的,这适用于我的编译器(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的任何想法都是犹太教的?有更清洁的方法吗?
答案 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测试;早期版本可能需要不同的专业化。)
†您问题中的语法不是默认构造,而是值初始化。