0

正如标题所说,有没有办法做这样的事情:

typedef vector<int> ListInt;
string ListInt::GetSomeValue() { //Add method to 'ListInt'
    return "value";
}
int ListInt::SomeField; //Add field\variable to 'ListInt'

无继承等(减少编译时间)

对不起,短信很抱歉,但我认为这已经足够了。

4

3 回答 3

2

这可以用我知道的使用统一函数调用语法或运行时类型修改的语言来解决。C++ 都不支持这些,所以,不,我认为你在这里没有选择。有很多“关闭”解决方案,例如继承或自由函数或封装类型 - 但没有一个完全符合您的要求。

于 2012-08-18T20:39:07.927 回答
2
//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";
}

地址为SomeFieldasListInt::SomeField和地址为GetSomeValueas ListInt::GetSomeValue。例子:

ListInt listInt;
listInt.SomeField = 3;
listInt.GetSomeValue( ); //Returns 'value'
listInt->push_back(2); //Use `vector<int>`'s fields.
于 2012-08-18T20:48:54.847 回答
1

有没有办法将字段/方法添加到使用“typedef”定义的类型中?

首先需要回答的是typedef真正的含义。A为现有类型typedef创建别名,但创建新类型。之后的typedef新名称将与原始名称完全相同,并且在大多数情况下,这两个名称都可以互换使用*

一旦清楚了,答案似乎很明显:您不能从typedef别名中添加或删除任何功能,因为它完全引用了另一种类型。没有两种类型,只有一种:原版。


*原始类型和通过 a 创建的别名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实际类型,并且所有符号和名称修改都将像使用实际类型一样执行。

于 2012-08-18T23:49:29.693 回答