2

多くのコマンド ライン オプションを備えたコードベースがあります。現在、各コマンド ライン オプションは、コマンドがコマンド ラインで渡された場合に実行される関数ポインタと共にテーブルに存在します。

例えば

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
    ...
}

これは可能ですか?

4

4 に答える 4

6

関数のアドレスによって特殊化されたテンプレートを使用してそれを行うことができます。

#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使用すると、リンカーは別の翻訳単位で適切な定義を見つけます。

于 2013-08-13T12:48:04.420 に答える