函数可以返回类型吗?

时间:2020-10-19 17:59:02

标签: c++

我想知道在C ++中是否有任何办法可以做到这一点:

$(some typename) func() {
    if (/*condition*/) return int;
    else return bool;
}

编辑:我想我还不够清楚。我想知道您是否可以这样说:func() var = /*something*/。基本上,该函数返回的内容类似于intbool(类型,而不是该类型的值)。

3 个答案:

答案 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>
   );
}