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

C++ C++;返回模板类对象的静态非成员函数,c++,class,templates,return-type,non-member-functions,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> } 模板 课例 { .... }; 静态示例非成员函数(i

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

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

static Example non_member_function(int var) {
  if (var == 1)
     return Example<float>;
  else
     return Example<int>
}
模板
课例
{
.... 
};
静态示例非成员函数(int-var){
如果(var==1)
返回示例;
其他的
返回示例
}

这不起作用,因为返回类型示例是一个模板。如何编写此返回类型

如果不将函数作为模板,则无法在返回值中使用不同的类型-每个返回类型定义一个新函数,它们都是不同的

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


请注意,然后返回一个指向本地对象的指针,该对象在函数结束后未定义。您需要返回一个新对象(
return new Example;
),或者使两个对象在函数中保持静态并返回它们的地址-这取决于您是希望每次返回一个新对象,还是始终返回同一个对象。

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

如果您知道在编译时需要什么类型,可以执行以下操作:

template <typename T> static Example<T> non_member_function() {
     return Example<T> ();
}
模板静态示例非成员函数(){
返回示例();
}
然后这样称呼它:

Example <int> example1 = non_member_function <int> ();
示例example1=非成员函数();

示例example2=非成员函数();
C++不(直接)允许您尝试执行的操作
Example
Example
是不相关的类,它们不一定有任何共同点。所以你不能让一个函数返回两个不同的东西,就像你不能编写一个函数,有时返回一个
double
,有时返回一个
std::vector


有一些方法可以做类似的事情,但哪种方法合适实际上取决于您希望函数以这种方式运行的原因以及您打算对返回的值执行的操作。

您不能返回非专用的
示例。我认为在这种情况下,使用
std::variant
不会有任何好处。我认为这需要更多的继承或设计反思。请提供更多上下文。这可能是X/Y问题。更多关于您为什么希望这样做的详细信息可能有助于其他人提出更好的选择。按值返回会在必要时复制或移动本地对象(通常可以避免这样做)。没有必要跳转到返回指针或引用,也绝对没有必要求助于原始的
new
@aschepler-你读过他的问题吗?他需要转向指针,因为不可能返回对不同类型的引用。这句话适用于这样做的后果。合适的替代方案可能包括多态性、重构成多个函数、模板、
变体、
任何
、可调用对象或其他方法。我在问题中没有看到足够的信息来推荐一个特定的起点。
Example <float> example2 = non_member_function <float> ();