我不得不承认标题听起来有点奇怪。但我会向你展示我想要用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()设置的任何(可投射)类型。 有没有机会实现这个目标?
感谢您的帮助!!
答案 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;
}