是否可以编写一个函数,该函数接受一种类型并返回(相关的)类型。例如,一个函数接受名为“RandomVariable”的类型,并返回名为“RandomVariableCovariance”的类型。总之,问题是类型名称可以作为参数或返回类型。 C++0x可以考虑。
你不能使用函数完成这个任务,但可以使用模板特化来完成。例如:
template <class T>
struct ConvertType;
template <>
struct ConvertType<RandomVariable>
{
typedef RandomVariableCovariance type;
};
int main()
{
ConvertType<RandomVariable>::type myVar;
}
定义了一个类型ConvertType
,它专门用于将RandomVariable
转换为RandomVariableCovariance
。通过这种方式可以做出各种聪明的类型选择,具体取决于您的需求。
类型名称不能作为函数的参数或返回值;类型是编译时的事情!
这是C++0x的长列表中的一项。这就是为什么他们创建了这种奇怪的函数定义格式:
auto FuncName(Type1 param1, Type2 param2) -> ReturnType {...}
它与decltype结合使用,可以让你做出像这样的事情:
auto FuncName(Type1 param1, Type2 param2) -> decltype(param1 + param2) {...}
这意味着返回类型将是在调用 operator+(Type1, Type2) 时得到的任何内容。
请注意,C++ 是一种静态类型语言。您无法在运行时进行类型计算。必须通过类似此类机制或某种形式的模板元编程在编译时完成。
抱歉我的 C 代码很糟糕,因为我已经很久没有真正使用它了:
typedef int RandomVariable;
typedef float RandomVariableCovariance;
RandomVariableCovariance myFunc(RandomVariable x) {
....
}
RandomVariable
作为参数并返回类型RandomVariableCovariance
),还是一种模板函数,它可以从其参数类型中确定其返回类型? - Matteo Italiatemplate <typename T> RVTraits<T>::cov_type covariance(const T & x, const T & y);
。 - Kerrek SBchar_traits
,或者算法和iterator_traits
一样... traits 在泛型程序设计中是一个非常有用的概念。 - Kerrek SB