修改类内的泛型引用

时间:2014-06-11 14:05:10

标签: c++ generics boost

我不得不承认标题听起来有点奇怪。但我会向你展示我想要用C ++的东西:

class MyClass {
public:
  template<typename T>
  void set( T& val ) {
    _value = val;
  }

  void someOtherFunction() {
    _value = std::string("12") //this is always a std::string
  }

private:
  boost::any _value;
};

int main() {
  MyClass a;
  int val;
  a.set(val);
  a.someOtherFunction();

  std::cout << val << std::endl;

}

所以我希望在main内部的val变为12.这也适用于我使用MyClass.set()设置的任何(可投射)类型。 有没有机会实现这个目标?

感谢您的帮助!!

1 个答案:

答案 0 :(得分:0)

由于std::string不能转换为int(或其他许多内容),我假设您要解析字符串。 boost::any也按值而非按引用存储,因此您可能必须实现自己的容器,如下所示:

#include <sstream>
#include <memory>
#include <iostream>

struct value_holder
{
  virtual ~value_holder() {}
  virtual void operator=(const std::string& source) = 0;
};

template<typename T> struct value_holder_impl: value_holder
{
  T& value;

  value_holder_impl(T& v): value(v) {}

  void operator=(const std::string& source) {
    std::istringstream(source) >> value;
  }
};

class MyClass {
public:
  template<typename T>
  void set( T& val ) {
    _value = std::make_shared<value_holder_impl<T>>(val);
  }

  void someOtherFunction() {
    *_value = std::string("12");
  }

private:
  std::shared_ptr<value_holder> _value;
};

int main() {
  MyClass a;
  int val;
  a.set(val);
  a.someOtherFunction();

  std::cout << val << std::endl;
}