c++ - 如何用模板函数替换宏?

标签 c++ templates macros

我有宏:

#define TWO_CMD( c1, c2 ) { const long r1=c1; if ( r1 ) return r1; return c2; }

并使用:

long MyClass::SomeFunc( long a )
{
    //...
    if ( a )
        TWO_CMD( Func<int>(a), Func<void>() );
    else
        TWO_CMD( Func<double>(), Func<std::string>(a) );
    //...
}

Func 是模板成员函数。 但关键的要求是保持代码的可读性!

我猜想有一个模板成员函数的变体,它以指向成员函数的指针作为参数:

return two_cmd( Func<int>, a, Func<void> );

但是这个语法不清楚。

最佳答案

首先:在宏中隐藏 return 语句是邪恶的。当人们查看这个函数时,根本不清楚那些对 TWO_CMD 的调用实际上会导致该函数返回。

最简单的方法是将可调用对象传递给函数模板并让它返回结果:

template <typename R, typename F, typename G>
R Evaluate(const F& f, const G& g) {
    R x = f();
    return x ? x : g();
}

用作:

return Evaluate<long>(
    std::bind(&MyClass::Func<int>, this, a), 
    std::bind(&MyClass::Func<void>, this));

return Evaluate<long>(
    std::bind(&MyClass::Func<double>, this), 
    std::bind(&MyClass::Func<std::string>, this, a));

如果您的编译器和标准库不支持 C++0x 或 C++ TR1 bind,Boost 中有一个几乎相同的实现。

(我将函数命名为 Evaluate 因为我实在想不出这个函数的好名字。)

关于c++ - 如何用模板函数替换宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4343159/

相关文章:

c++ - 在 OpenCV C++ 中绘制一条穿过 Blob 的曲线

c++ - 迭代器和模板

haskell - 如何在我的 LISP 中实现宏系统

c++ - 链接 operator= 用于只写对象 - 可以返回 rhs 而不是 *this?

c++ - 为什么while中的循环计数器超出了整型变量的范围,所以不是无限循环?

c++ - 为什么此宏没有扩展?

c++ - 在 C++ 模板中省略空 <>

c++ - 具有特定类型作为泛型参数的 STL 容器

loops - 使用 lisp 循环宏进行高级循环

c - 宏中参数的意外多重评估