如何模拟模板变量声明
How to mimic template variable declaration
我有一个基本类型Item<N>
,它依赖于整数模板参数N
和类Data
,其中包含几个不同N
的Item<N>
实例。
下面是一个示例:
template<unsigned N>
struct Item { ... }; // some template data type
struct Data
{
std::set<Item<1>> items1;
std::set<Item<2>> items2;
std::set<Item<3>> items3;
std::set<Item<4>> items4;
std::set<Item<5>> items5;
bool contains(const Item<1>& x) { return items1.find(x) != items1.end(); }
bool contains(const Item<2>& x) { return items2.find(x) != items2.end(); }
bool contains(const Item<3>& x) { return items3.find(x) != items3.end(); }
bool contains(const Item<4>& x) { return items4.find(x) != items4.end(); }
bool contains(const Item<5>& x) { return items5.find(x) != items5.end(); }
};
现在有了几个像contains
这样的函数,有很多代码重复。有没有更优雅的方式来实现Data
?
例如,您可以存储合适的std::tuple<...>
并让您的contain()
函数成为模板,例如:
template <int... I>
struct DataImpl {
std::tuple<std::set<Item<I>>...> data;
template <int J>
bool contains(Item<J> const& x) {
return std::get<J-1>(data).find(x) != std::get<J-1>(data).end();
}
};
using Data = DataImpl<1, 2, 3, 4, 5>;
以下内容可能会有所帮助:
struct Data
{
std::tuple<std::set<Item<1>>,
std::set<Item<2>>,
std::set<Item<3>>,
std::set<Item<4>>,
std::set<Item<5>>> items;
template <int N>
bool contains(const Item<N>& x) const {
static_assert(0 < N && N < 6, "N out of range");
return std::get<N - 1>(items).find(x) != std::get<N - 1>(items).end();
}
};
带有"类型列表"的东西怎么样,如下所示:
template <unsigned int ...> struct Data;
template <> struct Data<> {};
template <unsigned int N, unsigned int ...Tail>
struct Data : Data<Tail...>
{
std::set<Item<N>> item;
bool contains(const Item<N> & x) const { return item.find(x) != item.end(); }
};
用法:
Data<2, 8, 19> data; // contains sets of Item<2>, Item<8> and Item<19>
相关文章:
- 在将变量声明为引用时,堆在释放后使用
- 静态变量声明和定义
- 在变量声明中使用 for 循环
- 向量索引变量声明(size_t 或 std::vector<DATATYPE>::size_type)
- C++ 类型类的变量声明不命名类型?
- 将本地 OpenCV Mat 变量声明为静态以防止重新分配
- std::enable_if 更改成员 *变量* 声明/类型
- 在C++中,变量声明左侧的大括号是什么意思?
- 将变量声明为全局变量,然后声明为局部变量 -Shadowing-
- 命名空间内C++变量声明
- 将静态全局变量声明为内联有什么意义吗?
- 如何将一个变量声明为另一个变量的值
- 如何将迭代器变量声明为私有成员变量
- 没有变量声明为函数,但错误:二进制表达式的操作数无效
- 有没有人有书面证据来保证函数中参数的定义方式与普通变量声明相同?
- ClangTool 如何获取变量声明中模板参数的位置?
- 标准与显式自动推导变量声明
- C 静态变量声明怪异链接器错误
- 如何为数组成员变量声明 getter/setter
- 可视C++变量声明