如何创建具有指定数量的元素(相同类型)的 boost::tuple
How to create a boost::tuple with the specified number of elements (of the same type)?
假设我有以下类定义:
template <unsigned int N>
class foo
{
boost::tuples::tuple<...> bar;
};
给定编译时常量N
,我想将bar
的类型扩展为包含指定类型的N
元素的元组。也就是说,foo<2>::bar
的类型将是 boost::tuples::tuple<T, T>
.我猜我可以为此使用 Boost.MPL,但我还没有弄清楚确切的顺序。我想我可以做到:
template <typename T, int N>
struct type_repeater
{
typedef typename boost::mpl::fold<
boost::mpl::range_c<T, 0, N>,
boost::mpl::vector<>,
boost::mpl::push_back<_1, T>
>::type type;
};
因此,例如type_repeater<T, 2>::type
等同于boost::mpl::vector<T, T>
。我只是不确定如何/是否可以像我想要的那样获取该类型列表并将其注入元组的参数列表中。这可能吗?
似乎是一个很好的最小示例,使用 C++11
#include <tuple>
template <unsigned int N, typename T>
struct type_repeater {
typedef decltype(std::tuple_cat(std::tuple<T>(), typename type_repeater<N-1, T>::type())) type;
};
template <typename T>
struct type_repeater<0, T> {
typedef decltype(std::tuple<>()) type;
};
int main() {
type_repeater<3, float>::type asdf;
std::get<0>(asdf);
std::get<1>(asdf);
std::get<2>(asdf);
}
尽管这完全可以通过可变参数模板和std::tuple
来实现,但我认为您想要的最佳解决方案是只使用 std::array
.如果您只需要一个包含 N 个 T 实例的容器,则std::array
签名已经template <typename T, std::size_t N> class array
。我认为它完全符合您的需求。
话虽如此,如果你出于某种原因真的想要std::tuple
你可以这样做:
#include <tuple>
/* Forward declaration. */
template <std::size_t N, typename T>
class Tuple;
/* Convenience type alias. */
template <std::size_t N, typename T>
using TTuple = typename Tuple<N, T>::type;
/* Base case. */
template <typename T>
class Tuple<0, T> {
public:
using type = std::tuple<>;
}; // Tuple<0>
/* Recursive case. */
template <std::size_t N, typename T>
class Tuple {
public:
/* Note the use of std::declval<> here. */
using type = decltype(std::tuple_cat(std::declval<std::tuple<T>>(),
std::declval<TTuple<N - 1, T>>()));
}; // Tuple<N, T>
/* std::declval<> is necessary to support non default constructable classes. */
class NoDefault {
public:
NoDefault() = delete;
}; // Foo
/* Sample use. */
static_assert(std::is_same<TTuple<2, NoDefault>,
std::tuple<NoDefault, NoDefault>>::value, "");
int main() {}
注意:如果您无法访问 C++11 但可以访问 boost,则 boost::array
和 boost::tuples::tuple
可以代替 std::array
和 std::tuple
。
由于您明确要求将mpl::vector制作成运行时容器的方法,因此我建议您保留Boosty并使用Fusion的as_vector:
给定您的初始示例,其中 mol::fold 得到一个 mpl::vector,然后您将使用:
boost::fusion::result_of::as_vector<
mpl::vector<T, T>
>::type;
获得融合矢量,这似乎是您想要的。Boost Fusion填补了编译时和运行时世界之间的空白。
此外,这是C++11之前,这在许多(也许是大多数?)项目中仍然很重要。
- 将迭代器作为 3 个元素的滑动窗口,可以超调边界(可能使用 Boost)
- boost multi_index - 如果元素类型仅支持移动语义,如何遍历它?
- 如何使用 boost 属性树来解析 boost 中 json 字符串中的数组中的元素?
- 如何从boost :: multi_index_container检索元素
- Boost Ptree访问第一个元素,没有路径名
- 对于Boost.Propertytree,有没有办法使用JSON点表示法来引用数组元素?
- 无法从boost multi_index_container 中删除元素
- 从equal_range查询中筛选和修改 boost::multi_index 中的元素
- boost::instrusive::list 带有自动取消链接钩子:我可以使用列表中的值来确定列表是否只有一个元素
- 如何使用强制性最小元素的Boost Spirit列表操作员
- 从Boost Multi_index数组移动元素
- 任何表示具有有序元素的对的 stl/boost 类型
- 使用 Boost.Bind 打印矢量元素
- Boost::Spirit::QI解析器:已解析元素的索引
- Boost Qi::p hrase_parse 只读取第一个元素
- boost::unordered_multimap:有效地获取bucket中的所有元素
- 如何创建具有指定数量的元素(相同类型)的 boost::tuple
- 传入一个函数,该函数递增 boost::fusion:vector 的元素
- Boost 的无锁队列是否有可能丢失元素?
- boost::lockfree-为排队的元素调用析构函数