鉴于我有一个由枚举模板化的函数,我想“typedef / alias”函数来简化其用法。这里有类似的问题:(Typedef with template functions,C++11: How to alias a function?)
以下是我提出的三种可能的解决方案,以及我不喜欢的解决方案:
上面列出的方法是否存在其他特殊优点/缺点(除了个人不喜欢)?是否应该不惜一切代价避免一些?
虚拟示例:
foo_lib.h
#ifndef _FOO_LIB_H_
#define _FOO_LIB_H_
enum class Score {
LOSS = 0,
DRAW = 1,
WIN = 3
};
void AddScore(int *current_score_p, const Score &score);
template <Score SCORE>
void AddScore(int *current_score_p) {
AddScore(current_score_p, SCORE);
}
// 1. macro
#define ADD_SCORE_DRAW(current_score_p) AddScore<Score::DRAW>((current_score_p))
// 2. static function pointer (auto would work too)
static void (*AddScoreDrawStatic)(int *current_score_p) = &AddScore<Score::DRAW>;
// 3. Explicit function for each case
void AddScoreDrawSpecial(int *current_score_p);
// 4. Like 3., but inline to keep in header
inline void AddScoreDrawInline(int *current_score_p) { AddScore<Score::DRAW>(current_score_p); }
#endif // _FOO_LIB_H_
foo_lib.cpp
#include "foo_lib.h"
void AddScore(int *current_score_p, const Score &score) {
*current_score_p += static_cast<int>(score);
}
void AddScoreDrawSpecial(int *current_score_p) {
AddScore<Score::DRAW>(current_score_p);
}
答案 0 :(得分:0)
如果你的目的是为一个整数添加一个得分并将结果存储在一个整数中,那么最简单的做法就是创建一个可以像score = add_score(score, Score::DRAW);
那样被调用的函数,它具有很强的可读性。另外,我讨厌宏。
int add_score(int previous_score, Score score);
在我看来,使用非类型模板参数进行模板化并不会提高可读性