【发布时间】:2020-04-01 08:08:47
【问题描述】:
很抱歉这个残暴的标题。
场景是我的程序中有一个配置系统,它需要能够保存所有类型的值。这些值(配置)需要保存在同质容器中。
例如:(这是伪代码,我不确定它的实际外观)
configurant i(64);
configurant b(true);
configurant f(128.f);
configurant custom(Color(255, 255, 255));
vector<configurant> confs;
confs.emplace_back(i);
confs.emplace_back(b);
confs.emplace_back(f);
confs.emplace_back(custom);
// some form of accessing the vector with proper configurant type here:
// casting?
就像我说的,我不知道这个系统在实践中会是什么样子。我知道这样的声明
auto color = confs.at(3).rgb();
在 C++ 中通常是不可能的,但是我可以用模板化元编程做些什么来尝试尽可能接近这个解决方案吗? (也许配置器可以映射到它们的类型?但这不会是编译时操作)
我希望创建一个可同质存储、立即访问(不存储在堆上)并在编译时评估操作有效性的系统。
欢迎任何建议。
在 cmets 进来之前,我已经尝试过 std::any/std::any_cast、std::variant、访问者模式和其他类似性质的东西。我不想使用任何这些系统。
编辑 为避免混淆,有 N 个配置器:它不是一组静态大小的配置器。此界面的用户将添加更多配置项。
编辑 2 所需用法的其他示例
class foo {
configurant enabled;
configurant bar;
public:
foo() {
this->enabled = configurant(true);
this->bar = configurant(5);
}
void body() {
if(this->enabled) {
std::cout << (this->bar < 100) << "\n";
}
}
// It also needs to be kept in mind that these configurant classes
// cannot be templated (directly, at least), since they need to be stored in
// a homogeneous container.
};
【问题讨论】:
-
Do
confs必须是vector的configurant。还是tuple<int,bool,float,Color>? -
这个接口意味着能够接受任何和所有类型。所以元组不起作用。 int、bool、float 和 Color 只是我决定使用的四个示例。有 N 个配置项,而不是静态数量。很抱歉造成混乱。
-
因此任何数据类型都可以存储在具有任意数量元素的存储的 any 索引中,但编译器必须检查在任何这些索引处执行的操作是否一致与存储的数据? (啊!好吧,我想我明白了:我们今天是 4 月 1 日!这很好,谢谢;^)
-
@prog-fh 是的,这基本上就是我所追求的。当你这样说的时候,听起来越来越不可能了。
-
正如@generic_opto_guy 所建议的,最接近的解决方案依赖于
std::tuple,但必须在编译时选择存储数据的数量、顺序和类型。
标签: c++ templates metaprogramming