我需要推导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;
被解析为函数指针。
谢谢,您能帮我解决这个问题吗?
答案 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)