質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++11

C++11は2011年に容認されたC++のISO標準です。以前のC++03に代わるもので、中枢の言語の変更・修正、標準ライブラリの拡張・改善を加えたものです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

2223閲覧

テンプレートとマクロの組み合わせでカンマが区切り判定になる

saki_chan

総合スコア40

C++11

C++11は2011年に容認されたC++のISO標準です。以前のC++03に代わるもので、中枢の言語の変更・修正、標準ライブラリの拡張・改善を加えたものです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/08/16 02:41

とあるマクロを作ろうとしたときに、テンプレートを絡ませていました。
その際に、複数の型を指定するときのカンマがマクロの区切りとして判定されてしまいます。

C++

1#include <type_traits> 2 3#define STATIC_ASSERT_MACRO(COND) \ 4 static_assert(COND); 5 6STATIC_ASSERT_MACRO(std::is_same_v<int, int>); 7 8int main() 9{ 10 return 0; 11}

"std::is_same_v<int,int>"がCONDではなく、
"std::is_same_v<int"がCONDで、
上の場合は存在しませんがint>が第二引数扱いになります。

複数の型を指定するテンプレートをマクロで正常に渡す方法はありますか?
渡せない場合は、どのようにすれば解決するでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

マクロを呼び出す側でひとつ余計に括弧で囲むという方法がよく知られています。

cpp

1STATIC_ASSERT_MACRO((std::is_same_v<int, int>));

不格好ですが、マクロを使うという前提を崩さないのであればこれ以上の解はないと思います。

投稿2019/08/16 07:40

SaitoAtsushi

総合スコア5444

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

複数の型を指定するテンプレートをマクロで正常に渡す方法はありますか?

__VA_ARGS__が利用できます。

c++

1#define STATIC_ASSERT_MACRO(...) \ 2 static_assert(__VA_ARGS__); 3 4STATIC_ASSERT_MACRO(std::is_same_v<int, int>)

投稿2019/08/16 10:48

yohhoy

総合スコア6191

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

テンプレートをうまく使えば、マクロでないと困る事例はC言語より大分少ないはずです
オーバーヘッドが気になるなら、inlineをつけた関数にするのがいいと思います

それでもマクロが必要なら、一旦変数に入れたり、typedefで定義したりして、
マクロにカンマが入らないようにします

auto result = std::is_same_v<int, int>; STATIC_ASSERT_MACRO(result); typedef std::map<int, int> intmap; MACRO(intmap);

投稿2019/08/16 03:13

izmktr

総合スコア2856

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

saki_chan

2019/08/16 03:46

書いていなくて申し訳ないですが、今回質問した理由は、ライブラリの静的エラーチェックのマクロを作成するためです。 その際に少し特殊ですが、 ``` #define MACRO(REQUIRE) static_assert(std::is_same_v<REQUIRE, decltype(nullptr)>) ``` と書かなければいけない仕様になっています。 REQUIREの部分にstd::enable_if_t<Cond,std::nullptr_t>を入れたいというような感じです。 そして、できれば一行で書きたいので、型エイリアス等をあまり使用したくはありません。 ですので、マクロで渡す方法がないか、と思い質問しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問