【问题标题】:a macro on templates模板上的宏
【发布时间】:2011-09-16 15:31:18
【问题描述】:

不确定我想做的事情是否不好,但这是我的问题: 我有一些模板功能,例如

std::vector<T> operator - (const std::vector<T>& data1, const std::vector<T>& data2);
std::vector<T> operator * (const std::vector<T>& data1, const std::vector<T>& data2);
std::vector<T> operator & (const std::vector<T>& data1, const std::vector<T>& data2);

....等等。除了运算符之外,所有这些函数都有完全相同的定义,所以我试图写一个这样的宏

#define _BINARY_OP_ON_DATASET (OP_TYPE)
  template <typename T> \
  std::vector<T> operator OP_TYPE (const std::vector<T>& data1, const std::vector<T>& data2)\
  {\
    std::vector<T> result;\
    result.push_back(data1.begin().val OP_TYPE data1.begin().val)/*sample implementation*/\
    return result;\
  }

_BINARY_OP_ON_DATASET (&)
_BINARY_OP_ON_DATASET (+)

我得到一堆错误

Error   1   error C2833: 'operator OP_TYPE' is not a recognized operator or type
Error   2   error C2988: unrecognizable template declaration/definition
Error   3   error C2059: syntax error : 'newline'
Error   5   error C2143: syntax error : missing ';' before '<'
Error   6   error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

...还有更多 谁能看出这是什么问题?

感谢您的帮助。

简历

【问题讨论】:

  • 你怎么去+ 两个包含T 的向量?还有你怎么去&amp;-这两个向量呢?
  • 我的错......这是一个错字,编辑过的代码
  • ok.. 正如 Kerrek SB 和 ildjarn 指出的那样,它们是愚蠢的语法错误。
  • 好问题,我不知道您可以将非变量类的东西(如运算符)发送到宏。很漂亮,我喜欢宏...*眼泪*
  • 每次有人使用宏,上帝都会杀死一只小猫。每次有人滥用操作员超载,上帝就会杀死一只小猫。每次有人用宏滥用运算符重载时,小猫就会直视死亡的眼睛并面临灭绝。 (顺便说一句:您是否考虑过使用valarray&lt;T&gt; 而不是vector&lt;T&gt;?)

标签: c++ templates macros


【解决方案1】:

删除宏名称和它的参数之间的空格。

#define _BINARY_OP_ON_DATASET(OP_TYPE)

\ 添加到模板的第一行

#define _BINARY_OP_ON_DATASET(OP_TYPE)\

删除小错误,例如你在函数体第二行忘记的;

result.push_back(data1.begin().val+data1.begin().val);

而且它编译得很好!

【讨论】:

    【解决方案2】:

    宏参数列表前没有空格!

    #define _BINARY_OP_ON_DATASET(OP_TYPE) ...
                                ^^^
    

    【讨论】:

    • ahhh ,该死的..如此愚蠢的错误..我讨厌自己
    • @ildjarn:啊,是的,第一个换行符没有转义。很好的收获。
    【解决方案3】:

    您在宏参数列表之前有一个无效空格,并且错过了在它之后转义换行符:

    #define _BINARY_OP_ON_DATASET(OP_TYPE) \
        ...
    

    【讨论】:

      【解决方案4】:

      我认为重复定义比宏定义它们更简单:) 有时重复自己比提高打字效率更好。

      【讨论】:

      • 在一些非常简单的情况下也许可以,但是您的代码可能很大并且需要重复。重复定义意味着如果你在一个地方改变一些东西,你必须在所有地方都去改变它,这会引入可能的不一致。
      • 嗯,我试过了,哈哈。希望我们可以在没有反对票的情况下完成:\
      • alrite 我会给你一个去掉-1
      • @blueskin 非常感谢......事后看来,我并没有真正回答你的问题,而是在思考我自己(不)想看到的东西代码:\ 我可以看到这在大型代码库中是如何有用的,正如 Shahbaz 所说。
      • 我基本上是出于同样的目的使用的,我开始为我的函数编写模板,一段时间后我意识到我最终可能会编写大约 30-40 个函数。所以想到创建宏,我总是想编写更少的代码,因为它更易于维护且错误更少。 (当然在这种情况下更难调试)
      猜你喜欢
      • 2015-10-16
      • 1970-01-01
      • 1970-01-01
      • 2012-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-07
      • 1970-01-01
      相关资源
      最近更新 更多