我不确定是否可能,所以这就是我想要找到的.
我想创建一个接受任何类型的函子/可调用对象的函数,但我想知道参数类型是什么.(但不强制执行)
所以,这个捕获所有但不给我参数的类型:
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)
(使用或不使用回调作为中间变量)
由于我需要根据用户期望的值类型修改行为,我需要知道他/她期望的类型.
我正在尝试创建一个可以使用带有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) 我想知道为什么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)
限制:
function_type_deducer([](){}).describe_me();x和y,如y需要string&,哪里x需要string.(std :: function也没有注意到这一点)关于如何修复其中任何一个的任何想法?我重新改造了车轮吗?