我有一个包含许多命令行选项的代码库。目前,每个命令行选项都与一个函数指针一起存在于一个表中,如果在命令行上传入命令则运行该函数指针。
例如
static CommandFunction s_Commands[] =
{
{ "command1", Func1 },
{ "command2", Func2 },
{ "command3", Func3 },
etc...
};
我的问题是,表格很大,函数位于其他地方。我更希望命令的字符串位于每个函数的旁边。
例如:
COMMAND_ARG("command1")
void Func1()
{
dostuff
...
}
COMMAND_ARG("command2")
void Func2()
{
dostuff
...
}
COMMAND_ARG("command3")
void Func3()
{
dostuff
...
}
这可能吗?
最佳答案
您可以使用一个由函数地址专门化的模板来做到这一点:
#include <stdio.h>
// In a header file.
template<void(*Fn)()>
struct FnMeta
{
static char const* const meta;
};
// no definition of meta
// some.cc
void some() {}
template<> char const* const FnMeta<some>::meta = "some";
// another.cc
void another() {}
template<> char const* const FnMeta<another>::meta = "another";
// main.cc
int main() {
printf("%s\n", FnMeta<some>::meta);
printf("%s\n", FnMeta<another>::meta);
}
上面的想法是FnMeta<>::meta
没有定义。但是,不同的翻译单元(.cc 文件)可以提供 FnMeta<>::meta
的特化定义。 .这样当FnMeta<X>::meta
链接器在另一个翻译单元中找到它的适当定义。
关于c++ - 是否有一种将元数据与 C++ 中的函数相关联的简洁方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18209404/