C++11可变模板函数存储
C++11 variadic template function storage
我目前正在将回调系统重新设计为C++11可变模板。基本上,我要做的是存储一个带有返回值和任意数量参数的函数。
之后,应该调用此函数,从boost::archive
加载参数,并将返回值写回另一个存档。
#include <string>
#include <map>
#include <iostream>
#include <boost/archive/binary_iarchive.hpp>
#include <boost/archive/binary_oarchive.hpp>
using iarchive = boost::archive::binary_iarchive;
using oarchive = boost::archive::binary_oarchive;
using namespace std;
template<class Interface>
class RFCProvider : public Interface {
class FuncStore {
public:
virtual ~FuncStore() {}
virtual void call(iarchive& in, oarchive& out) = 0;
protected:
template <class T> T read(iarchive& in) { T a; in >> a; return a; }
};
template<class Return, class... Args>
class FuncStoreRetN : public FuncStore {
public:
typedef Return(Interface::*Function)(Args... args);
typedef Return ReturnType;
static const int ArgCount = sizeof...(Args);
private:
struct pass {
Return res;
pass(Interface* me, Function func, Args... args) { res = (me->*func)(args...); }
};
Interface* mMe;
Function mFunc;
public:
FuncStoreRetN(Interface* me, Function func) : mMe(me), mFunc(func) {}
void call(iarchive& in, oarchive& out) {
pass c{mMe, mFunc, read<Args>(in)...};
out << c.res;
}
};
map<string, FuncStore*> functionStore;
public:
template<class Return, class... Args>
void registerFunction(const string& name, Return(Interface::*func)(Args...)) {
functionStore[name] = new FuncStoreRetN<Return, Args...>(this, func);
}
};
class TestClass {
public:
bool foo(int x) { return x == 0; }
};
int main() {
RFCProvider<TestClass> p;
p.registerFunction("foo", &TestClass::foo);
return 0;
}
根据我的理解,pass c{mMe, mFunc, read<Args>(in)...};
应该扩展到pass c{mMe, mFunc, read<int>(in), read<string>(in), ...};
,对吗?
但是我不能用g++编译(Ubuntu 4.8.2-19ubuntu1)4.8.2
error: expected primary-expression before ‘>’ token
pass c{mMe, mFunc, read<Args>(in)...};
^
有什么建议吗?
编辑:添加MCVE
更换
pass c{mMe, mFunc, read<Args>(in)...};
带有
pass c{mMe, mFunc, FuncStore::template read<Args>(in)...};
由于所有这些都发生在类模板中的嵌套类(和类模板)中,因此应用依赖名称查找,并且必须为编译器添加常见的说明。
相关文章:
- 是否可以将绑定函数存储在容器中?
- 不从成员函数C 存储返回值认为不良习惯
- 正在可能将任何类型的函数存储在一个可能的变量中
- 将具有任意参数和占位符的函数存储在类中,然后再调用它
- (C )将lambda函数存储在Boost Multi_Array中
- 使用 SSE 内部函数存储四个 16 位整数
- Boost绑定和Boost函数,将带有参数的函数存储在向量中,然后执行它们
- C++11可变模板函数存储
- 将结构变量从函数存储到局部结构变量
- 将多种类型的 lambda 函数存储在一种类型的变量中
- 函数存储在内存的哪一部分
- 构造函数存储与传入的内容不同
- 将boost::bind函数存储在std::map中
- 如何将参数从可变参数模板成员函数存储到向量中
- 将类成员函数存储在模板中
- 将一个对象的成员函数作为回调函数存储在另一个对象中
- 函数存储中的变量
- 需要某种方法将函数存储在列表中,然后调用它们
- 对象的成员函数存储在哪里
- 衰减lambda指向的函数存储在哪里?它是如何被释放的