c++ - 是否有一种将元数据与 C++ 中的函数相关联的简洁方法

标签 c++

我有一个包含许多命令行选项的代码库。目前,每个命令行选项都与一个函数指针一起存在于一个表中,如果在命令行上传入命令则运行该函数指针。

例如

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/

相关文章:

c++ - 让本地符号走向全局

c++ - 为什么这个 C++ 构造函数会自动指向复制构造函数?

c++ - 模板化成员函数不能从同一个类调用非模板化成员函数,C++

c++ - 如何安全地将 unique_ptr 与可以返回 NULL 的函数一起使用?

c++ - Dev C++ 在指针地址的情况下给出不同的结果

c++ - 初学者引用类型参数混淆

c++ - 我的编译器挑战了基本的 C++ 继承?

c++ - 插入排序将数组排序到一半

c++ - 类似于用于 C++ 单元测试的 Google Test 的工具?

c++ - 为什么这个 Boost Spirit 示例没有编译?