Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.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++ 元编程C/C++;:如何避免在此处使用宏?_C++_Macros_Metaprogramming - Fatal编程技术网

C++ 元编程C/C++;:如何避免在此处使用宏?

C++ 元编程C/C++;:如何避免在此处使用宏?,c++,macros,metaprogramming,C++,Macros,Metaprogramming,我正在编写一个CheckedPtr类来练习异常处理(Stroustrup,TC++PL练习,第四版,问题14.1)。我想重载一堆操作符,实现这一点的代码几乎是一样的。我使用宏是为了避免过于重复,但我知道宏是危险的,所以我想知道是否存在更好的方法 这是我的代码——显示的部分是我在一个名为CheckedPtr的类中定义的部分。我可以做得更好吗,或者没有宏?我宁愿不要手动编写所有这些函数,即使这意味着宏存在一些风险 //这是相对危险的。 #定义检查\u PTR\u过载\u比较器(OP)\ 模板\ 布尔

我正在编写一个CheckedPtr类来练习异常处理(Stroustrup,TC++PL练习,第四版,问题14.1)。我想重载一堆操作符,实现这一点的代码几乎是一样的。我使用宏是为了避免过于重复,但我知道宏是危险的,所以我想知道是否存在更好的方法

这是我的代码——显示的部分是我在一个名为CheckedPtr的类中定义的部分。我可以做得更好吗,或者没有宏?我宁愿不要手动编写所有这些函数,即使这意味着宏存在一些风险

//这是相对危险的。
#定义检查\u PTR\u过载\u比较器(OP)\
模板\
布尔运算符OP(Ptr&p){return pos OP&*p;}
检查\u PTR\u过载\u比较器(=)
已检查\u PTR\u过载\u比较器()
检查\u PTR\u过载\u比较器(=)
#未定义检查\u PTR\u过载\u比较器

正如评论者所说,不要为此使用宏。如果你想有一个最小的实现,但一套完整的比较函数,我相信是你最好的选择。我链接到的页面上显示的示例是:

struct animal : public boost::less_than_comparable<animal>
{
  std::string name;
  int legs;

  animal(std::string n, int l) : name{std::move(n)}, legs{l} {}

  bool operator<(const animal &a) const { return legs < a.legs; }
};
struct-animal:public-boost::比同类产品少


在本例中,我看不出您的宏给您带来了太多tbh。重复代码真的那么糟糕吗?这些函数非常简单。我不认为使用宏会使代码更简单。相反,在这种情况下,阅读宏代码对我来说更复杂。不要这样做。你似乎意识到你在两种邪恶之间取得平衡;但编译器消息、调试器、实时代码解析器和其他程序员都已从宏演变而来。这些比较函数是实际编程项目中非常小的一部分。所以,只要确保没有安全的方法可以像我对宏所做的那样进行一般性的编写。Boost运算符似乎更好——但是我认为用一个全新的库来处理这样一个小程序是有意义的,尤其是因为我还在学习C++。我将切换到普通代码,即使对于更大的实现,您的方式更好。谢谢。是的,对于你正在学习的一个小程序,直接做这些事情。但是boost似乎对所有人都是无处不在的,除了那些遵守“我们不使用第三方代码”规则的人,因此您可能希望将它作为步骤3添加到步骤1)学习该语言的基础知识和2)学习标准库之后。Boost相当大,一些库比其他库更容易被接受,所以您希望一次只接受一个库。