【发布时间】:2017-06-06 15:28:58
【问题描述】:
我正在为用 C++ 编写的软件编写一个插件,这是一个定义插件的 sn-p:
extern "C"
irods::ms_table_entry* plugin_factory() {
// The number of msParam_t* arguments that it will accept
int numArguments = 2;
irods::ms_table_entry* msvc = new irods::ms_table_entry(numArguments);
msvc->add_operation(
"my_microservice",
std::function<int(msParam_t*, msParam_t*, ruleExecInfo_t*)>(MyMicroservice)
);
return msvc;
}
我希望能够使用numArguments 动态生成std::function<int(msParam_t*, msParam_t*, ruleExecInfo_t*)> 参数包。其中numArguments 表示msParam_t* 参数的数量。
我不是 C++ 专家(尤其是模板方面),所以after some research 我发现这可能可以通过实现以下内容来实现:
- std::tuple
- std::tuple_cat
- std::index_sequence
- std::make_integer_sequence
但我真的不知道如何开始实施这一点。我发现的例子很难理解,我无法将它们转化为我自己的需求。任何人都可以提供有关这可能如何工作的提示、简短示例或参考吗?非常感谢任何信息!
【问题讨论】:
-
在编译时是否知道
numArgument? -
不可能动态地执行此操作,因为这将涉及代码生成,但您可以静态生成它或静态生成它。 add_operation 的类型是什么?
-
@DavideSpataro - 不,
numArgument将在运行时定义。 -
是否代表
MyMicroservice的参数个数?如果确实如此,则在编译时就知道了。 -
你不能在运行时做一些应该在编译时已经完成的事情...
std::make_index_sequence需要在编译时知道的参数在那个时候生成适当的std::integer_sequence如果你在编译时不知道值你注定要创建你希望支持的所有可能的选项,然后在运行时从以前预编译的类型中选择一个......