正如其他评论员所说,C++ 并没有为每个对象提供一个通用的基类。从理论上讲,您可以创建自己的并从中派生所有内容:
class Object
{
protected:
Object(){};
virtual ~Object(){};
public:
virtual std::string toString() const {return("");};
}; // eo class Object
但是,这对整数类型(例如 int、short)没有帮助。您必须自己制作:
class Int : public Object
{
private:
int m_nVal;
public:
Int(int _val = 0) : m_nVal(_val){};
Int(const Int& _rhs) : m_nVal(_rhs.m_nVal){};
virtual ~Int(){};
// operators
operator int() const {return(m_nVal);}
bool operator == (const Int& _rhs) const {return(m_nVal == _rhs.m_nVal);};
bool operator == (int _val) const {return(m_nVal == _val);};
Int& operator = (const Int& _rhs) {m_nVal = _rhs.m_nVal; return(*this);}:
Int& operator = (int _val) {m_nVal = _val; return(*this);};
// .... and all the other operators
// overrides
virtual std::string toString() const
{
std::ostringstream oss;
oss << m_nVal;
return(oss.str());
};
}; // eo class Int
然后,您必须对要使用的所有其他类型执行此操作。完成后,您可以将它们作为整数、布尔值、长整数等传递(感谢运算符重载)。更好的方法是对整数类型使用模板类:
template<class T> class IntegralType : public Object
{
private:
T m_Val;
public:
// rest of class looks the same
}; // eo class IntegralType<>
然后 typedef 他们离开:
typedef IntegralType<int> Int;
typedef IntegralType<short> Short;
typedef IntegralType<long> Long;
即使使用像这样的模板类来完成工作,您仍然需要对字符串/布尔值进行专门化。在 IntegralType 上实现运算符 ++ 可以很好地处理数字,但会在 std::string 上抛出。
如果你走模板路线,你现在已经有了“对象”、整数类型和一些字符串、布尔值的特化。但为了更加模仿 .NET,您可能需要引入接口进行比较:
template<class T> class IEquitable
{
public:
virtual Equals(T _other) = 0;
}; // eo class IEquitable<>
这可以很容易地融入到您的 IntegralType 类和专业中。
但正如另一位评论员指出的那样,您为什么要这样做? boost::any 如果您尝试执行类似 Tuple 之类的操作,它具有任意类型的名称和值。如果您需要构建这些集合,那么您的设计存在根本性的问题。例如,在我用 C# 编写的所有代码中,我从未编写过:
List<Object> list = new List<Object>();
可能有:
List<Vehicle> list;
List<Employee> List;
Dictionary<string, Alien> aliens;
但从来没有对象级别的任何东西。为什么?除了调用 ToString() 或者进行一些冒险的转换之外,你为什么要这样做?泛型存在于编程中,因此我们不必拥有对象列表(或者在 C++ 的情况下为 void*)。
所以你有它。上面显示了你可能如何让对象和整数类型像 C# 一样工作,我错过了很多东西。现在是时候审视您的设计并决定这是否是您真正需要做的。