C ++模板;作为模板参数传递的函数的自动推论返回类型;

时间:2019-10-28 07:27:54

标签: c++ templates decltype

我需要推导getter函数的返回值类型。该getter作为函数指针传递到模板列表中。

所以吸气剂看起来像:

UPDATE your_table
SET Nationality = 
CASE
    WHEN Customer_ID =  10001 THEN 'Russian'
    WHEN Customer_ID =  10002 THEN 'Swiss'
    WHEN Customer_ID =  10003 THEN 'Italian'
    WHEN Customer_ID =  10004 THEN 'French'
    WHEN Customer_ID =  10004 THEN 'Swiss'
    ELSE 'Other'
END
WHERE Nationality IS NULL

模板类

using TGetter   = std::function<std::string(Me*)>;

std::string getter(Me* me)
{
    return std::string("string");
}

实例是这样的:

template<typename TGetter>
class Handler
{
public:
    Handler(TGetter getter)
        :m_getter(getter)
    {};

    using TValue =  std::string;  //decltype(TGetter()); <- something like that I want to get

private:
    TGetter                     m_getter;
    ...

    bool handler();

我要根据getter返回类型声明Handler<TGetter> h(getter); 。 因此,TValue和示例中的getter一样。我要使用不同类型的吸气剂和魔杖来声明各自的类型,就像在类中std::string一样。

TValue value;被解析为函数指针。

谢谢,您能帮我解决这个问题吗?

4 个答案:

答案 0 :(得分:2)

如果您的函数没有参数,只需使用std::declval

using TValue = decltype(std::declval<TGetter>()(/* your args go here */));

答案 1 :(得分:2)

您可以使用std::invoke_result(自C ++ 17起)。

using TValue = std::invoke_result_t<TGetter, Me*>;

在C ++ 17之前,您使用std::result_of,请注意,它在C ++ 17中已弃用,其用法与std::invoke_result不同。

using TValue = std::result_of_t<TGetter(Me*)>;

答案 2 :(得分:2)

如果仅使用std::function,则可以这样做:

template <typename TGetter> class Handler;

template <typename Ret, typename ... Ts>
class Handler<Ret(Ts...)>
{
public:
    using TGetter = std::function<Ret(Ts...)>;

    Handler(TGetter getter) : m_getter(getter) {}

    using TValue = Ret;

private:
    TGetter                     m_getter;
    // ...

    bool handler();
};

使用诸如Handler<std::string(Me*)> h(&getter);

如果需要任何可调用类型,则:

template <typename TGetter>
class Handler
{
public:
    Handler(TGetter getter) : m_getter(getter) {}

    using TValue = decltype(declval<TGetter>()(/*args*/));

private:
    TGetter                     m_getter;
    // ...

    bool handler();
};

答案 3 :(得分:1)

您正在寻找的是result_type,可能是:

//...
public:
  using TValue =  typename TGetter::result_type;
//...

Demo