作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有宏:
#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> );
但是这个语法不清楚。
最佳答案
第一件事:在宏中隐藏返回语句是邪恶的。当查看此函数时,根本不清楚那些对 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/
我是一名优秀的程序员,十分优秀!