我有以下功能:
template<class F>
struct c_style_callback_t {
F f;
template<class...Args>
static void(*get_callback())(Args..., void*) {
return [](Args...args, void* fptr)->void {
(*static_cast<F*>(fptr))(std::forward<Args>(args)...);
};
}
void* get_pvoid() {
return std::addressof(f);
}
};
template<class F>
c_style_callback_t< std::decay_t<F> >
c_style_callback( F&& f ) { return {std::forward<F>(f)}; }
我一直在使用它,
auto task = c_style_callback(
[=] (Foo *foo, char *bar) { ... }
);
但是现在我想将task
存储在vector<???>
中。这里需要使用什么类型?
我试图将auto
更改为int
,以便编译器显示有关无法转换内容的错误。我从那里复制粘贴了该类型,替换了int
,但是没有用。
故意看到编译器期望的错误类型
error: cannot convert 'c_style_callback_t<SomeClass::subscribe(const string&, std::function<void(const std::__cxx11::basic_string<char>&)>, QoS)::<lambda(Foo*, char*)> >' to 'int' in initialization
已替换auto
:
c_style_callback_t<SomeClass::subscribe(const string&, std::function<void(const std::__cxx11::basic_string<char>&)>, QoS)::<lambda(Foo*, char*)> > task2 = c_style_callback(
[=] (Foo *foo, char *bar) { }
);
新错误:
error: template argument 1 is invalid
c_style_callback_t<SomeClass::subscribe(const string&, std::function<void(const std::__cxx11::basic_string<char>&)>, QoS)::<lambda(Foo*, char*)> > task2 = c_style_callback(
error: cannot convert 'c_style_callback_t<SomeClass::subscribe(const string&, std::function<void(const std::__cxx11::basic_string<char>&)>, QoS)::<lambda(Foo*, char*)> >' to 'int' in initialization
答案 0 :(得分:2)
据我了解,您需要了解c_style_callback的类型,才能将c_style_callback的任何实例存储到向量中。
要了解您可以执行的任务类型
#include <iostream>
#include <vector>
template<class F>
struct c_style_callback_t {
F f;
template<class...Args>
static void(*get_callback())(Args..., void*) {
return [](Args...args, void* fptr)->void {
(*static_cast<F*>(fptr))(std::forward<Args>(args)...);
};
}
void* get_pvoid() {
return std::addressof(f);
}
};
template<class F>
c_style_callback_t< std::decay_t<F> >
c_style_callback(F&& f) { return { std::forward<F>(f) }; }
int main()
{
auto task = c_style_callback(
[=](double *foo, char *bar) { }
);
std::cout << typeid(decltype(task)).name() << std::endl;
std::vector<decltype(task)> v;
v.push_back(task);
return 0;
}
此代码返回(在Visual Studio 2017上)
struct c_style_callback_t<class <lambda_f2990127907fab7e430587a3832f9637> >
然后您看到问题开始了。 Lambda表达式具有唯一的类型,请参见Can the 'type' of a lambda expression be expressed?。
答案 1 :(得分:0)
这需要C ++ 14。
创建一个返回自动回调函数的函数。
import re
Birthday = str(input("insert your birth<(ex) xxxxy **m 00d> : "))
p= re.sub('[ymd ]','',Birthday)
print(p) #result is "xxxx**00"
然后可以创建函数的十进制类型的向量:
auto create_callback(/**/)
{
return c_style_callback([=](Foo* foo, char* bar) { //...
});
}
然后可以这样做:
std::vector< decltype(create_callback()) > vec;