正如标题所说,有没有办法做这样的事情:
typedef vector<int> ListInt;
string ListInt::GetSomeValue() { //Add method to 'ListInt'
return "value";
}
int ListInt::SomeField; //Add fieldvariable to 'ListInt'
没有继承等(以减少编译时间)
对不起,短信,但我认为这就足够了。
//ListInt.h
struct ListInt {
vector<int> *operator->( );
vector<int> *operator*( );
int SomeField;
string GetSomeValue( );
private:
vector<int> internalvalue;
};
//ListInt.cpp
vector<int> *ListInt::operator->( ) {
return &internalvalue;
}
vector<int> *ListInt::operator*( ) {
return &internalvalue;
}
string ListInt::GetSomeValue( ) {
return "value";
}
将SomeField
地址设置为ListInt::SomeField
,将地址设置为GetSomeValue
ListInt::GetSomeValue
。例:
ListInt listInt;
listInt.SomeField = 3;
listInt.GetSomeValue( ); //Returns 'value'
listInt->push_back(2); //Use `vector<int>`'s fields.
这是在我知道使用统一函数调用语法或运行时类型修改的语言中解决的。这些都没有得到C++的支持,所以,不,我认为你在这里别无选择。有很多"接近"的解决方案,比如继承或自由函数或封装类型 - 但没有一个完全像你所要求的那样。
有没有办法将字段/方法添加到使用"typedef"定义的类型中?
首先需要回答的是typedef
的真正含义。typedef
为现有类型创建别名,但不创建新类型。在typedef
之后,新名称将引用与原始名称完全相同的类型,并且这两个名称可以在大多数上下文中互换使用*。
一旦明确了这一点,答案似乎很明显:您无法在typedef
别名中添加或删除任何功能,因为它引用的正是另一种类型。没有两种类型,只有一种:原始。
* 原始类型和通过typedef
创建的别名不是 100% 等效的,尽管差异很小。特别是,原始类型的名称(假设它是用户定义的,std::vector<X>
是)驻留在与函数、变量或typedef
别名不同的标识符空间中。typedef
名称不是类型的名称,而是类型的别名。以下代码显示了其中一个差异:
struct A {};
typedef A B;
struct A a; // creates a variable `a` of type `A`
//struct B b; // error, `B` is a typedef, not a `struct`
一些最显着的差异仅在编译多个翻译单元时才明显:typedef
别名始终是翻译单元的内部。目标文件中生成的任何符号都不会引用typedef
。编译器将解析实际类型的typedef
,并且所有符号和名称重整都将像使用实际类型一样执行。