C ++静态非成员函数返回模板类的对象

时间:2017-10-24 22:59:11

标签: c++ class templates return-type non-member-functions

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

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

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

这不适用于返回类型示例是模板。如何编写此返回类型

3 个答案:

答案 0 :(得分:1)

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

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

注意,然后您将返回指向本地对象的指针,该指针在函数结束后未定义。您需要返回一个新对象(return new Example<float>;),或者让两个对象在函数内部保持静态并返回它们的地址 - 如果您想每次返回一个新对象,或者总是返回相同的对象,则返回。

答案 1 :(得分:0)

它并没有真正起作用 - 编译器需要知道返回类型是什么,并且您要返回Example <int>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> ();

答案 2 :(得分:0)

C ++没有(直接)允许你尝试做的事情。 Example<float>Example<int>是不相关的类,它们不一定有任何共同之处。所以你不能让一个函数返回两个不同的东西,比编写一个有时返回double的函数更多,有时会返回std::vector<int>

有一些方法可以做类似的事情,但这恰当取决于你希望函数以这种方式运行的原因以及你想要对返回值做什么。