好吧,这适用于我的编译器(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 是否是正确的,有什么想法吗?有没有更干净的方法来做到这一点?
最佳答案
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 header 之后添加以下代码:
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 进行测试;早期版本可能需要不同的特化。)
†您问题中的语法不是默认构造,而是值初始化。
关于c++ - 返回使用 boost.assign 初始化的匿名 tr1 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8302057/