相关疑难解决方法(0)

是否有可能找出lambda的参数类型和返回类型?

给定一个lambda,是否可以找出它的参数类型和返回类型?如果有,怎么样?

基本上,我想要lambda_traits哪些可以用于以下方式:

auto lambda = [](int i) { return long(i*10); };

lambda_traits<decltype(lambda)>::param_type  i; //i should be int
lambda_traits<decltype(lambda)>::return_type l; //l should be long
Run Code Online (Sandbox Code Playgroud)

背后的动机是我想lambda_traits在一个接受lambda作为参数的函数模板中使用,我需要知道它的参数类型和函数内部的返回类型:

template<typename TLambda>
void f(TLambda lambda)
{
   typedef typename lambda_traits<TLambda>::param_type  P;
   typedef typename lambda_traits<TLambda>::return_type R;

   std::function<R(P)> fun = lambda; //I want to do this!
   //...
}
Run Code Online (Sandbox Code Playgroud)

目前,我们可以假设lambda只接受一个参数.

最初,我尝试使用std::function:

template<typename T>
A<T> f(std::function<bool(T)> fun)
{
   return A<T>(fun);
}

f([](int){return true;}); //error
Run Code Online (Sandbox Code Playgroud)

但它显然会给出错误.所以我将其更改TLambda为函数模板的版本,并希望在函数std::function内部构造对象(如上所示).

c++ lambda metaprogramming traits c++11

133
推荐指数
3
解决办法
3万
查看次数

从函数类型中剥离所有限定符

给定一个可能的varargs函数类型,可能有cv-qualifier-seq和可能的ref-qualifier,是否可以编写一个类型特征来剥离所有限定符而不编写4*3*2 = 24个部分特化?

template<class T>
struct strip_function_qualifiers;

template<class R, class... Args>
struct strip_function_qualifiers<R(Args...)> { using type = R(Args...); };

template<class R, class... Args>
struct strip_function_qualifiers<R(Args..., ...)> { using type = R(Args..., ...); };

template<class R, class... Args>
struct strip_function_qualifiers<R(Args...) const> { using type = R(Args...); };

template<class R, class... Args>
struct strip_function_qualifiers<R(Args..., ...) const > { using type = R(Args..., ...); };

template<class R, class... Args>
struct strip_function_qualifiers<R(Args...) const &> { using type = R(Args...); }; …
Run Code Online (Sandbox Code Playgroud)

c++ templates c++11 c++14 c++17

18
推荐指数
1
解决办法
716
查看次数

为什么没有std :: make_function()?

std::function<>几乎任何可调用的东西都是一个有用的包装器,包括自由函数,lambda,仿函数,成员函数,结果std::bind.但是,在创建a时std::function<>,必须明确指定函数签名(取自此处)

struct Foo {
    Foo(int num) : num_(num) {}
    void print_add(int i) const { std::cout << num_+i << '\n'; }
    int num_;
};

void print_num(int i)
{ std::cout << i << '\n'; }

struct PrintNum {
    void operator()(int i) const
    { std::cout << i << '\n'; }
};

// store a free function
std::function<void(int)> f_display = print_num;

// store a lambda
std::function<void()> f_display_42 = []() { print_num(42); };

// store the result of …
Run Code Online (Sandbox Code Playgroud)

c++ function c++11

15
推荐指数
2
解决办法
2886
查看次数

标签 统计

c++ ×3

c++11 ×3

c++14 ×1

c++17 ×1

function ×1

lambda ×1

metaprogramming ×1

templates ×1

traits ×1