首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Typedef模板函数

Typedef模板函数
EN

Stack Overflow用户
提问于 2017-06-28 08:25:55
回答 1查看 201关注 0票数 0

考虑到我有一个由枚举模板化的函数,所以我想要使用这个函数来简化它的使用。类似的问题:(Typedef with template functionsC++11: How to alias a function?)

以下是我想出的三种可能的解决方案,以及我不喜欢它们的地方:

  1. 编写一个包含函数的宏。问题:宏(名称空间安全?)
  2. 静态函数指针问题:变量(例如,需要添加#务实部分来禁用Wunused变量)
  3. 为每一种情况编写明确的函数。问题:创建全新的函数(不只是重命名原来的函数),更多的写作容易出错,更多的函数调用
  4. 与3.相同,但内联保持在标题中。这可能是我最喜欢的。问题:创建全新的函数(不只是重命名原来的函数),更多的函数调用

除了个人不喜欢之外,上面列出的方法还有其他特殊的优点/缺点吗?是否应该不惜一切代价避免某些问题?

虚构的例子:

foo_lib.h

代码语言:javascript
复制
#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

代码语言:javascript
复制
#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);
}
EN

回答 1

Stack Overflow用户

发布于 2017-06-28 08:30:55

如果您的目的是将分数添加到整数中并将结果存储在整数中,那么最简单的方法就是创建一个可以调用的函数,比如score = add_score(score, Score::DRAW);,它非常容易读。而且我讨厌宏。

代码语言:javascript
复制
int add_score(int previous_score, Score score);

在我看来,使用非类型模板参数的模板不会提高可读性。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44797309

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档