能否编写一个函数,该函数接受一个类型并返回不同的类型?

5

是否可以编写一个函数,该函数接受一种类型并返回(相关的)类型。例如,一个函数接受名为“RandomVariable”的类型,并返回名为“RandomVariableCovariance”的类型。总之,问题是类型名称可以作为参数或返回类型。 C++0x可以考虑。


3
说出你想要解决的问题,也许我们可以找到一个好的设计思路。 - Kerrek SB
你应该澄清一下:你想要一个操作类型的函数(即以类型 RandomVariable 作为参数并返回类型 RandomVariableCovariance),还是一种模板函数,它可以从其参数类型中确定其返回类型? - Matteo Italia
对于一个随机变量来说,它的均值与其实现的类型相同(因此在类内编写一个接口,并将其底层类型作为模板参数非常容易),但是它的协方差是不同的类型(虽然相关,但方式较为复杂)。如果随机变量是一个N个元素的向量(比如ublas向量类型),那么这个随机变量的协方差将会是一个N x N的元素矩阵(比如ublas矩阵类型)。我希望不需要让该类显式指定其协方差的类型,而是能够从其实现中推断出来。如果有帮助的话,我可以提供示例代码。 - bpw1621
2
@bpw1612: 可能最容易的方法是为您的随机变量创建一个特质类!这样,您可以说template <typename T> RVTraits<T>::cov_type covariance(const T & x, const T & y); - Kerrek SB
1
@bpw: 是的,像字符串和 char_traits,或者算法和 iterator_traits 一样... traits 在泛型程序设计中是一个非常有用的概念。 - Kerrek SB
显示剩余2条评论
4个回答

11

你不能使用函数完成这个任务,但可以使用模板特化来完成。例如:

template <class T>
struct ConvertType;

template <>
struct ConvertType<RandomVariable>
{
    typedef RandomVariableCovariance type;
};

int main()
{
    ConvertType<RandomVariable>::type myVar;
}

定义了一个类型ConvertType,它专门用于将RandomVariable转换为RandomVariableCovariance。通过这种方式可以做出各种聪明的类型选择,具体取决于您的需求。


我完全忽略了你的回答... :P +1。 - Xeo

2

类型名称不能作为函数的参数或返回值;类型是编译时的事情!


这是C++0x;那里可能有它。 - Nicol Bolas
@Nicol:C++0x 超出了我的知识范围!如果你能写一个描述它的答案,我就会删除我的回答... - Oliver Charlesworth
@Nicol:你的回答并没有涉及到在运行时操作类型(或类型名称),而这正是OP问题所暗示的... - Oliver Charlesworth

0

这是C++0x的长列表中的一项。这就是为什么他们创建了这种奇怪的函数定义格式:

auto FuncName(Type1 param1, Type2 param2) -> ReturnType {...}

它与decltype结合使用,可以让你做出像这样的事情:

auto FuncName(Type1 param1, Type2 param2) -> decltype(param1 + param2) {...}

这意味着返回类型将是在调用 operator+(Type1, Type2) 时得到的任何内容。

请注意,C++ 是一种静态类型语言。您无法在运行时进行类型计算。必须通过类似此类机制或某种形式的模板元编程在编译时完成。


这仍然是一种编译时代码生成功能,因此它并不真正“将类型作为参数”。 - Kerrek SB
2
你只能在编译时进行类型计算。所有的模板元编程和基于类型的计算都是由编译器完成的。C++是一种静态类型语言,不能进行运行时类型检查。 - Nicol Bolas
1
是的,当然,我只是想确保原帖作者知道这一点。干杯。 - Kerrek SB

-2

抱歉我的 C 代码很糟糕,因为我已经很久没有真正使用它了:

typedef int RandomVariable;
typedef float RandomVariableCovariance;

RandomVariableCovariance myFunc(RandomVariable x) {
    ....
}

我认为这是误解了重点;我对OP的问题的理解是希望实际返回一个类型;即在运行时操作类型! - Oliver Charlesworth
哦,基本上就是在C语言中创建类似于“变量变量”的东西?吓人...非常非常非常可怕。 - Marc B
这就是我理解原帖作者的问题的方式。如果不是这样,那么他表达得非常不清楚! - Oliver Charlesworth
OP 说的是函数,而不是方法。C++ 函数与 C 函数没有任何区别。 - Marc B
@Marc,“method”?是指答案过程的方法吗?还是你指的是《现代爱情的方法》(Method of Modern Love)? - Johannes Schaub - litb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接