0

我有一个静态非成员函数,它根据对象的类型返回一个模板类对象。

template< typename T >
class Example
{
.... 
};

static Example non_member_function(int var) {
  if (var == 1)
     return Example<float>;
  else
     return Example<int>
}

这不起作用,因为返回类型 Example 是一个模板。我该如何写这个返回类型

4

3 回答 3

1

你不能在返回值中使用不同的类型而不使函数成为模板 - 每个返回类型定义一个新函数,它们都是不同的。

更好的方法是返回一个指针,它允许多态。

请注意,您随后将返回一个指向本地对象的指针,该指针在函数结束后未定义。您需要返回一个新对象return new Example<float>;

于 2017-10-24T23:03:09.587 回答
0

它实际上并不是这样工作的 - 编译器需要知道返回类型是什么,并且您根据运行时传入的变量返回Example <int>or Example <float>(它们是不同的类型)。

如果你在编译时知道你想要什么类型,你可以这样做:

template <typename T> static Example<T> non_member_function() {
     return Example<T> ();
}

然后这样称呼它:

Example <int> example1 = non_member_function <int> ();

或者

Example <float> example2 = non_member_function <float> ();
于 2017-10-24T23:04:31.807 回答
0

C++ 不(直接)允许您尝试做的事情。Example<float>并且Example<int>是不相关的类,不一定有任何共同点。所以你不能让一个函数返回两个不同的东西,就像你不能编写一个有时返回 adouble有时返回 a的函数一样std::vector<int>

有一些方法可以做类似的事情,但哪种方法合适取决于您为什么希望函数以这种方式运行以及您打算如何处理返回的值。

于 2017-10-24T23:05:45.537 回答