相关疑难解决方法(0)

接受任何类型的可调用并且也知道参数类型

我不确定是否可能,所以这就是我想要找到的.

我想创建一个接受任何类型的函子/可调用对象的函数,但我想知道参数类型是什么.(但不强制执行)

所以,这个捕获所有但不给我参数的类型:

template < typename T >
void optionA( T );
Run Code Online (Sandbox Code Playgroud)

这个捕获最多,并具有参数的类型

template < typename T >
void optionB( std::function< void(T) > );
Run Code Online (Sandbox Code Playgroud)

但是这个不允许lambdas,所以

optionB( [](int){} );
Run Code Online (Sandbox Code Playgroud)

不会编译.这有点奇怪,因为这将编译:

std::function< void(int) > func = [](int){};
optionB( func );
Run Code Online (Sandbox Code Playgroud)

那么有没有办法接受所有选项,还知道期望哪种类型的参数?

提前致谢!

- 编辑 -

我想这样做的原因是我想让我的库用户注册一个特定类型的回调.对我来说,最自然的方式是

auto callback = []( int val ) { cout << "my callback " << val << endl; };
object.register( callback );
Run Code Online (Sandbox Code Playgroud)

(使用或不使用回调作为中间变量)

由于我需要根据用户期望的值类型修改行为,我需要知道他/她期望的类型.

c++ lambda templates functor c++11

14
推荐指数
2
解决办法
2733
查看次数

c ++ 0x:在lambda arity上重载

我正在尝试创建一个可以使用带有0,1或2个参数的lambda调用的函数.由于我需要代码在g ++ 4.5和vs2010上工作(它不支持可变参数模板或lambda转换到函数指针),我想出的唯一想法是选择基于arity调用哪个实现.以下是我应该如何看待的非工作猜测.有没有办法修复我的代码或者有更好的方法来执行此操作?

#include <iostream>
#include <functional>
using namespace std;

template <class Func> struct arity;

template <class Func>
struct arity<Func()>{ static const int val = 0; };

template <class Func, class Arg1>
struct arity<Func(Arg1)>{ static const int val = 1; };

template <class Func, class Arg1, class Arg2>
struct arity<Func(Arg1,Arg2)>{ static const int val = 2; };

template<class F>
void bar(F f)
{
    cout << arity<F>::val << endl;
}

int main()
{
    bar([]{cout << "test" << endl;});
}
Run Code Online (Sandbox Code Playgroud)

c++ lambda c++11

8
推荐指数
1
解决办法
2416
查看次数

使用两个以上的arg推导std :: function

我想知道为什么std::function只知道两个参数的功能.我写了一些运行良好的代码,但是有很多限制.任何反馈欢迎.特别是,我怀疑我正在重新发明轮子.

我的代码是关于ideone的,我将参考它.

例如,我可以用以下方式描述main:

function_type_deducer(main).describe_me();
// Output: I return i and I take 2 arguments.  They are of type:  i PPc
Run Code Online (Sandbox Code Playgroud)

(其中'i'表示'int','PPc'表示指向指针指向char的指针)

Standard std::function不适用于具有两个以上args的函数(请参阅我的代码的最后两行),但此代码可以使用(示例代码演示了三个arg函数).也许我的设计应该在标准库中使用!我定义typedef tuple<Args...> args_as_tuple;存储所有args,而不仅仅是前两个参数类型.

主要技巧是这个函数的推论:

template<class T, class... Args>
auto function_type_deducer(T(Args...)) -> Function__<T, Args...> {
        return Function__<T, Args...> {};
}
Run Code Online (Sandbox Code Playgroud)

限制:

  • 它不适用于lambdas.这不会编译function_type_deducer([](){}).describe_me();
  • 它没有注意到有差异小xy,如y需要string&,哪里x需要string.(std :: function也没有注意到这一点)

关于如何修复其中任何一个的任何想法?我重新改造了车轮吗?

c++ templates c++11 template-argument-deduction

3
推荐指数
1
解决办法
450
查看次数