c++ 从宏到模板

c++ from macros to templates

我正在尝试为函数模板更改一些宏(我们有很多)。很多时候,我有以下场景:

#include <iostream>

void function_A( void )
{
    std::cout << "function A" << std::endl;
}

void function_B( void )
{
    std::cout << "function B" << std::endl;
}

#define FOO( _bar ) \
do { \
    /* ... do something */ \
    function_##_bar(); \
    /* ... do something */ \
} while( 0 )

int main() 
{
    FOO( A );
    FOO( B );
}

如何将 FOO 表示为函数模板并获得相同的结果?

我在想:

template < ??? _bar >
void foo()
{
   // somehow link function_X and _bar
}

性能是必须的!!

提前致谢。

我认为您不需要函数模板。这是一种解决方案:

enum foo { A, B };

void CallFunction(foo f)
{
    switch(f)
    {
        case A: function_A(); break;
        case B: function_B(); break;
    }
}
...
int main()
{
    CallFunction(A);
    CallFunction(B);
}

您可以像 Zenith 的回答那样使用 case 语句,但您可以在编译时使用这样的模板来完成:

enum class FunctionOverload
{
    A, B
};

template <FunctionOverload T>
void function();

template<>
void function<FunctionOverload::A>()
{
    std::cout << "function A" << std::endl;
}

template<>
void function<FunctionOverload::B>()
{
    std::cout << "function B" << std::endl;
}

template <FunctionOverload T>
void foo()
{
    //do stuff
    function<T>();
    //do more stuff
}

int main() 
{
    foo<FunctionOverload::A>();
    foo<FunctionOverload::B>();
}

您实际上不能像使用模板那样进行字符串粘贴。可能有更好的方法来解决您的实际问题,但我能想到的解决您提出的问题的最直接方法是将函数的地址传递给模板(这具有进一步的优势,即您不限于函数,你可以传递任何可以不带参数调用的东西):

template <typename Callable>
void foo(Callable func)
{
    // Stuff
    func();
}

int main() 
{
    foo(&function_a);
    foo(&function_b);
}