Typedef模板化函数

时间:2017-06-28 08:25:55

标签: c++ templates alias typedef

鉴于我有一个由枚举模板化的函数,我想“typedef / alias”函数来简化其用法。这里有类似的问题:(Typedef with template functionsC++11: How to alias a function?

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

  1. 编写一个包装函数的宏。问题:宏(命名空间安全?)
  2. 静态函数指针。问题:变量(例如需要添加#pragma部分以禁用Wunused变量)
  3. 针对每种情况明确写出函数。问题:创建全新的功能(即不只是重命名原始功能),更容易出错,更多功能调用
  4. 与3.相同,但内联保留在标题中。这可能是我的最爱。问题:创建全新的功能(即不只是重命名原始功能),更多功能调用
  5. 上面列出的方法是否存在其他特殊优点/缺点(除了个人不喜欢)?是否应该不惜一切代价避免一些?

    虚拟示例:

    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);
    }
    

1 个答案:

答案 0 :(得分:0)

如果你的目的是为一个整数添加一个得分并将结果存储在一个整数中,那么最简单的做法就是创建一个可以像score = add_score(score, Score::DRAW);那样被调用的函数,它具有很强的可读性。另外,我讨厌宏。

int add_score(int previous_score, Score score);

在我看来,使用非类型模板参数进行模板化并不会提高可读性