类型的宏定义不起作用

Macro define for type is not working

本文关键字:不起作用 宏定义 类型      更新时间:2023-10-16

为什么下面的代码不工作?

// Template function definition
template <typename T>
void apply(const T& input);
// Helper macro definition
#define APPLY_FUNCTION(PIXELTYPE) 
  apply<##PIXELTYPE>(input);
// Use macro to call function
APPLY_FUNCTION(uint8_t);

这会产生以下错误:

错误:粘贴"<"answers"uint8_t"没有给出有效的预处理令牌

##用于将令牌粘贴在一起。你不需要这个,所以只要:

#define APPLY_FUNCTION(PIXELTYPE) apply<PIXELTYPE>(input);

也就是说,有两个指导方针:

  1. 不要用;结束你的宏,要求用户添加它会使你避免一些bug。
  2. 请不要写这个宏。

为什么要指定模板参数的类型呢?如果你不是特别想要一个宏,那么直接使用apply函数就可以了:

    template <class T>
    void apply(const T & input)
    {
        //...
    }
    apply(1.0f); // Will instantiate apply<float> to match the input's type

如果您希望类型T与传入的类型不同,那么我建议使用以下模板:

    template <class T, class Input>
    void apply(const Input & input)
    {
        T t(input);
        //...
    }

,然后可以用:

    apply<uint8_t>(1.0f);

根本不需要这个宏

在宏展开中,##告诉编译器将其前面的令牌与后面的令牌组合起来,并将结果视为单个令牌。正如错误消息所说,<uint8_t不是一个有效的令牌。把##去掉