是否可以在C ++中使用作用域类型作为宏名称?

时间:2016-12-21 21:42:37

标签: c++ macros

我想定义一个宏来完成以下任务:

class Program
{
   static void Main(string[] args)
    {
       Board d=new Board();
       Square s=new Square();
       s.m1(d);
    }
}

class Board
{
   int x=10;
}

class Square
{
    public void m1(Board a)
    {
      Console.WriteLine(a.x);
    }
  Console.ReadLine();
}

我无法做到这一点因为" #define std::vector Vector "似乎不允许在宏名称中。我想这样做的原因是我试图使用Stroustrup的范围检查向量(来自std_lib_facilities.h在他的书“编程原则与实践”中)。他使用:

:

(评论是Stoustrup')

问题在于我宁愿没有" // disgusting macro hack to get a range checked vector: #define vector Vector "在声明using namespace std;的头文件中。这意味着我需要在其他头文件中使用Vector,然后使用Stroustrup"宏hack"不起作用。我收到与" std::vector"相关的错误,这些错误不存在。

所以我的问题是:是否可以使用完全限定的类型名称作为宏名称,以便将其替换为" std::Vector"?

2 个答案:

答案 0 :(得分:4)

请勿使用预处理器。这就是别名模板的用途:

template<typename T>
using vector_in_use = std::vector<T>;

您在整个代码库中使用vector_in_use,它将使用std::vector编译您的代码。然后,要切换你只需要替换一行:

using vector_in_use = Vector<T>;

答案 1 :(得分:0)

好吧,你可以将你的Vector包含到std命名空间中,然后在每个使用它的文件中,你输入define和undef:

namespace std
{
#include "Vector.h"
}

#define vector Vector
//...
#undef vector

这真的很恶心,哈哈......但那就是做你想做的事。