Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Typedef模板函数_C++_Templates_Alias_Typedef - Fatal编程技术网

C++ Typedef模板函数

C++ Typedef模板函数,c++,templates,alias,typedef,C++,Templates,Alias,Typedef,假设我有一个由枚举模板化的函数,我希望使用“typedef/alias”函数来简化它的使用。这里有类似的问题:(,) 以下是我提出的三种可能的解决方案,以及我不喜欢它们的地方: 编写一个包装函数的宏。问题:宏(名称空间安全?) 静态函数指针。问题:变量(例如,需要添加#pragma节以禁用Wunused变量) 为每种情况明确地编写函数。问题:创建全新函数(即不只是重命名原始函数),编写更容易出错,函数调用更多 与3相同,但内联保留在标题中。这可能是我最喜欢的。问题:创建全新函数(即不只是重命名原

假设我有一个由枚举模板化的函数,我希望使用“typedef/alias”函数来简化它的使用。这里有类似的问题:(,)

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

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

    虚拟示例:

    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_
    
    \ifndef\u FOO\u LIB\H_
    #定义\u FOO\u LIB\u H_
    枚举类分数{
    损失=0,
    绘图=1,
    赢=3
    };
    无效添加分数(整数*当前分数、常量分数和分数);
    模板
    无效添加分数(整数*当前分数){
    AddScore(当前分数,分数);
    }
    // 1. 宏
    #定义添加分数绘制(当前分数p)添加分数((当前分数p))
    // 2. 静态函数指针(自动也可以)
    静态无效(*AddScoreDrawStatic)(int*当前分数=&AddScore;
    // 3. 每种情况下的显式函数
    void AddScoreDrawSpecial(整数*当前分数);
    // 4. 类似于3.,但内联以保留在标题中
    inline void AddScoreDrawInline(int*当前分数){AddScore(当前分数);}
    #endif/\u FOO\u 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);
    }
    
    #包括“foo_lib.h”
    无效添加分数(整数*当前分数、常量分数和分数){
    *当前_得分_p+=静态_投射(得分);
    }
    void AddScoreDrawSpecial(整数*当前分数){
    AddScore(当前分数);
    }
    
    如果您的目的是将分数添加到整数并将结果存储在整数中,那么最简单的方法就是创建一个可以像这样调用的函数
    score=add\u score(score,score::DRAW)非常可读。而且,我讨厌宏

    int add_score(int previous_score, Score score);
    

    在我看来,使用非类型模板参数进行模板设置并不能提高此处的可读性

    谢谢。的确,这也是我的初始函数所做的(除了写入指针和返回值)。这里的这个分数示例只是一个代码片段,但我需要它的实际应用程序要复杂一点。@Cedric您能详细说明一下您的实际用例是如何比您在问题中介绍的更复杂吗?这可能会影响我的回答。我有一个包含不同模块的框架,由ModuleID(enum)标识。然后,我有一些转换函数,这些函数需要数据从何处来,到何处去,例如AddData(module_id source,module_id local,data)。我希望每个模块都有一个版本,这样我就可以在模块“home”中的任何地方说AddDataHome(module_id source,data),而不必每次都传递它自己的id。@Cedric那么,为什么我上面解释的函数在您的情况下不起作用呢?它会起作用,但我必须在每次函数调用时传递模块自己的ID,这似乎是不必要的。