2016-12-21 12 views
3

私は、次の達成するためにマクロを定義したいと思います:「:は」マクロ名で許可されていないことのようですので、私はこれを行うことはできませんC++でスコープ付きの型をマクロ名として使用できますか?

#define std::vector Vector 

。私がこれをしたいのは、私がStroustrupのレンジチェックベクタ(std_lib_facilities.hのプログラミング原則とプラクティス)を使用しようとしているからです。彼が使用しています:

// disgusting macro hack to get a range checked vector: 
#define vector Vector 

問題は、私はVectorを宣言するヘッダファイルで「using namespace std;」を持ってしたくないということです(コメントはStoustrupのです)。つまり、他のヘッダーファイルにstd::vectorを使用する必要があり、Stroustrupの「マクロハック」が機能しません。存在しない "std::Vector"に関するエラーが表示されます。

私の質問です: "Vector"のようなものに置き換えるために、完全修飾型の名前をマクロ名として使用できますか?

+0

[C++ Visual Studio "Disgusting Macro Hack"コンパイルの問題の可能性のある複製](http://stackoverflow.com/questions/19716729/c-visual-studio-disgusting-macro-hack-compilation-issue) – Raindrop7

+0

これは本当に重複しているわけではありません。「嫌なマクロ・ハック」と別の「ベクトル」を含む別の問題です。 – freeze

+1

トークンの間に空白を挿入できるということから分かるように、 'std :: vector'は3つのトークンです。 – MSalters

答えて

4

プリプロセッサを使用しないでください。あなたのコードベース全体でvector_in_useを使用し、そしてそれはstd::vectorを使用してコードをコンパイルします

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

:それは別名テンプレートがのためにあるものです。

using vector_in_use = Vector<T>; 
+0

ありがとう@StoryTeller。しかし、元のマクロの考え方は、 'vector'を使って書かれたコードで範囲をチェックすることができるようにすることです。 – freeze

+0

これは@StoryTeller作品: 'ベクトル=ベクトルを使用してテンプレート を;'が、これはSTDを使用していない 'テンプレート を行います::ベクトル=ベクトル;'私はあなたが再定義することはできませんのVisual C++ 2015 – freeze

+0

@freezeでコンパイラエラーC2061を取得'std :: vector'、ストーリーの終わりです。必要があると感じたら、問題を再検討する必要があります。多分それについて詳しく尋ねてみてください。 – StoryTeller

0

さて、あなたはstd名前空間にあなたのベクトルを含むことができ、それが使用されているすべてのファイルには、ユーザーが定義とはundefを置く:

namespace std 
{ 
#include "Vector.h" 
} 

#define vector Vector 
//... 
#undef vector 
次に、あなたを切り替えるためにのみ1行を交換する必要があります

本当にうんざりする、笑...しかし、それはあなたがしたいことをするだろう。

関連する問題