#define BLAH word
cout << BLAH;
これを行う方法はありますか?
試す
#define STRINGIFY(x) #x
#define STRINGIFYMACRO(y) STRINGIFY(y)
#define BLAH word
cout << STRINGIFYMACRO(BLAH);
間接レベルが追加されると、マクロの名前ではなく、マクロの値が文字列化されます。
「cout」はあなたがすることではありません。これは、std::ostream
タイプのインスタンスであるグローバル変数です。たとえば、「出力先cout
」と言うことができます。
#define
テキストの置換を行います。BLAH
基本的には、テキストエディタで検索と置換を使用して。に置換した場合と同じですword
。したがって、行cout << BLAH;
はに変わりますcout << word;
。動作しない場合cout << word;
は、がそのスコープ内の有効なステートメントではないためです。プリプロセッサは、周囲のテキストを気にしません。基本的にコードの理解はありません(コードをトークン化する方法を知っています。つまり、スペースを入れない場合は演算子やその他の句読点を分解しますが、それだけです)。
単語を印刷したい場合は、次の"word"
ことができます。
#define STRINGIFY(x) #x
cout << STRINGIFY(word);
私はあなたがこのようなものが欲しいと思う:
#include <typeinfo>
template <typename T>
void print_type()
{
std::cout << typeid(T).name() << std::endl;
}
int main()
{
print_type<float>();
print_type<int>();
}
の値typeid(T).name()
は実装で定義されており、まったくない場合があることに注意してください。タイプごとに関数を自分で作成せずに、保証された方法でタイプを出力する方法はありません。
式のタイプを推測するオーバーロードを作成することもできます。
#include <typeinfo>
template <typename T>
void print_type(const T&)
{
std::cout << typeid(T).name() << std::endl;
}
int main()
{
print_type(5.0f);
print_type(5.0);
}
(これは式を評価することに注意してください。これは不要ですが、それが問題になるとは思えません。)
数値のさまざまな表現、つまりfloatとdoubleについてプログラムをテストしています。定義された用語がfloatの場合、「Testingforfloat」を出力してほしい。
マクロをプリミティブtypedefとして悪用する必要はありません。
template<class T>
void do_test(char const *name) {
std::cout << "Testing " << name << "...\n";
T var = foo();
bar(var);
}
int main() {
do_test<float>("single precision");
do_test<double>("double precision");
return 0;
}
これにより、テストのパラメーターを単純に文字列化するのではなく、各テストに異なる名前(できればもっと意味のある名前)を付けることができますが、必要に応じて「float」と「double」を名前にすることができます。
本当に、本当にパラメータを文字列化したい場合、またはマクロに興味がある場合は、次のようにします。
#define DO_TEST(T) do_test<T>(#T)
int main() {
DO_TEST(float);
DO_TEST(double);
return 0;
}
OK、あなたのコメントに基づいて、これをもう一度試してみましょう:
数値のさまざまな表現、つまりfloatとdoubleについてプログラムをテストしています。定義された用語がfloatの場合、「Testingforfloat」を出力してほしい。
これがあなたの本当の意味のように聞こえます:
私は次のようなコードを持っています:
cout << "As a float:" << float(value) << endl;
cout << "As a double:" << double(value) << endl;
そして、テキストが型キャストと一致するように、これらの各行にマクロを作成したいと思います。
その場合、次のようなものが必要です。
#define DEBUG(t, x) cout << "As a " #t ":" << t(x) << endl
DEBUG(float, value);
DEBUG(double, value);