boost::any replacement for the code below
我希望摆脱对我的代码的 boost 依赖。我有以下结构构造。在代码中的另一个位置调用和使用此结构时,使用
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
struct Properties { public: Properties() {} Properties(const std::string &s, const boost::any & p) { name = s; value = p; } template <typename T> std::string name; |
只是为了好玩,我想我会创建一个极简的任何实现:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
////////////////////////////////////////// // my_any.hpp #include <memory> #include <stdexcept> struct my_any void swap(my_any& other) { _storage.swap(other._storage); } // todo move semantics template <typename T> T& any_cast(my_any& a) { template <typename T> T const& any_cast(my_any const& a) { |
然后您可以按照您的用例所示的方式使用它:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
struct Properties { public: Properties(const std::string &s="", const my_any& p={}) : name(s), value(p) {} template <typename T> Properties(T n) { value = n; } std::string name; #include <vector> typedef std::vector<Properties> Props; int main() std::cout <<"v.size():" << v.size() <<"/ v[0].value = v; try { std::cout <<"v[0].value.size():" << any_cast<Props>(v[0].value).size() <<"/ |
查看输出 Live On Coliru
1
2 3 4 5 6 |
Properties p("int", 42);
std::cout << boost::any_cast<int>(p.value) << ‘/ ‘; p = Properties("string", std::string("hello")); std::cout << boost::any_cast<std::string>(p.value) << ‘/ ‘; |
您不能只是将上面的类转换为模板并获得相同的功能。如果这样做,您将只能存储一种类型的值。而且您必须将整个
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
template<typename T> struct Properties { public: Properties() {} Properties(std::string s, T p) : name(std::move(s)) // should use initialization list instead , value(std::move(p)) // of assignment within the body {} Properties(T n) std::string name; |
但是,我上面发布的代码现在是非法的。
1
2 3 4 5 6 |
Properties<int> p("int", 42);
std::cout << p.value << ‘/ ‘; // p = Properties<std::string>("string", std::string("hello")); // will not compile because Properties<int> and Properties<std::string> are // distinct types |
如果这些限制没问题,那么修改后的定义应该适合你。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/268933.html