【发布时间】:2018-12-07 16:27:09
【问题描述】:
在某个地方,我觉得需要通过类似 INI 的接口更清晰地通过单个类管理不同的类,所以我写了这个
#include <vector>
#include <string>
#include <memory>
#include <iostream>
struct A {
using getter = int(A::*)();
using setter = void(A::*)(int);
virtual std::string get_name() = 0;
virtual getter get_getter(std::string property_name) = 0;
};
struct PropertyManager {
template<class Type>
using pointer = std::shared_ptr<Type>;
using string_type = std::string;
int get_property(string_type object_name,string_type property_name) {
A::getter property_getter = nullptr;
pointer<A> mo;
for(auto& o : objects) {
if (o->get_name() == object_name) {
mo = o;
property_getter = o->get_getter(property_name);
break;
}
}
if (property_getter == nullptr)
std::runtime_error{std::string{"no object named \""} + object_name + "\" found"};
return (mo.get()->*property_getter)();
}
void add_a(pointer<A> new_A) {
objects.push_back(new_A);
}
private:
std::vector<pointer<A>> objects;
};
struct testClass : A {
int my_number() {
return 8;
}
std::string get_name() override {
return "testClass";
}
getter get_getter(std::string property_name) override {
if (property_name == "my_number")
return static_cast<A::getter>(my_number);
throw std::runtime_error{std::string{"no property \""} + property_name + "\" found"};
}
};
int main() {
PropertyManager p;
p.add_a(std::make_shared<testClass>());
std::cout << p.get_property("testClass","my_number");
}
但是作为“属性”可以有任何其他类型,所以我觉得需要模板化代码但我不能,因为无法模板化虚函数,所以我显然不能通过这个接口来做,有没有其他方法做同样的事情,我的意思是有一个类可以通过类似接口管理不同类的不同属性
我仅限于 c++11
【问题讨论】:
-
你不应该包含来自
bits目录的头文件! -
我只需要那个来测试
-
从 A 派生的类集是有限的还是可能是无限的?
-
如果无限会好很多
-
std::function<std::any(const A&)>...
标签: c++ oop templates interface template-meta-programming