我想知道在C ++中是否有任何办法可以做到这一点:
$(some typename) func() {
if (/*condition*/) return int;
else return bool;
}
编辑:我想我还不够清楚。我想知道您是否可以这样说:func() var = /*something*/
。基本上,该函数返回的内容类似于int
或bool
(类型,而不是该类型的值)。
答案 0 :(得分:4)
一个函数不能选择在运行时返回哪种类型;它在编译时必须具有确定的返回类型。您可以使用的是具有成员类型的模板。为此,您将需要使用模板元编程。例如,下面是一个适配器模板,它将类型T
转换为其常量指针形式:
template <typename T>
struct make_const_ptr {
using type = const T*;
};
template <typename>
using make_const_ptr_t<T> = typename make_const_ptr<T>::type
从本质上讲,这是一个返回类型的“函数”,即您可以通过编写make_const_ptr_t<T>
来“调用”它。您可以使用模板元编程https://www.geeksforgeeks.org/template-metaprogramming-in-c/对类型进行更多操作。
此外,您在评论中说,您希望使用它来选择要在多态类型上使用的模板函数。更好的方法是使用虚函数。为不同的多态类型做不同的事情是虚函数的重点:
template <typename T>
void template_function(const T& obj) {
// ...
}
class Base {
// ...
virtual void do_template_function() = 0;
};
class D : public Base {
virtual void do_template_function() {
template_function<D>(*this);
}
};
class E : public Base {
virtual void do_template_function() {
template_function<E>(*this);
}
};
void f(Base* obj) {
// ...
obj->do_template_function();
// ...
}
答案 1 :(得分:0)
您无法执行预期的操作,但是可以使用模板返回不同的类型。例如这样的
#include <iostream>
template <class T>
T ret()
{
T i = 5;
if (i == 0)
{
int a = 1;
return a;
}
else
{
bool t = false;
return t;
}
}
int main ()
{
int t = ret<int>();
return 0;
}
答案 2 :(得分:0)
有一个可爱的库Boost.Hana,可用于C ++元编程中类型的计算。
使用Boost.Hana的函数可以返回表示C ++类型的对象,如下所示:
auto func()
{
return hana::if_(
/*constexpr condition*/,
hana::type_c<int>,
hana::type_c<bool>
);
}