残念ながら、私のライブラリの元のバージョンからいくつかのマクロが残っていて、かなりクレイジーな C を使用していました。特に、特定の型が渡されることを期待する一連のマクロがあります。次の行に沿って何かをすることは可能ですか:
static_assert(decltype(retval) == bool);
そしてどうやって?賢い代替手段はありますか?
はい、マクロが悪いことは承知しています。C++ は C などではないことは承知しています。
残念ながら、私のライブラリの元のバージョンからいくつかのマクロが残っていて、かなりクレイジーな C を使用していました。特に、特定の型が渡されることを期待する一連のマクロがあります。次の行に沿って何かをすることは可能ですか:
static_assert(decltype(retval) == bool);
そしてどうやって?賢い代替手段はありますか?
はい、マクロが悪いことは承知しています。C++ は C などではないことは承知しています。
@ UncleBensの提案を使用して、これが最もクリーンであることがわかりました。
#include <type_traits>
static_assert(std::is_same<decltype(retval), bool>::value, "retval must be bool");
decltype
式を取得したために必要なようですが、型を確認したいのです。これを行う方法はすでに十分にあります (C++03)。たとえば、ブールをチェックするには
inline void mustBeBool(bool) { }
template<typename T> inline void mustBeBool(T t) { & (&t); } // Takes address of rvalue (&t)
// Use:
#define DifficultMacro(B) do { mustBeBool(B); foo(B); } while (false)
免責事項:これは悪い答えです。間違いなく、はるかに優れたソリューションがあります。ほんの一例です:)
すでに実装されているはずですが、自分で実装するのは簡単です。
template <class T1, class T2> struct CheckSameType; //no definition
template <class T> struct CheckSameType<T,T>{}; //
template <class T1, class T2>
AssertHasType(T2)
{
CheckSameType<T1, T2> tmp; //will result in error if T1 is not T2
}
このように使用するには:
AssertHasType<bool>(retval);
代替 (GMan が提案):
template <class T1, class T2> struct SameType
{
enum{value = false};
}
template <class T> struct SameType<T,T>
{
enum{value = true};
};
のように使用するには
static_assert(SameType<decltype(retval), bool>::value);
inline
ほとんどのマクロは、関数やテンプレートに置き換えることができます。適切な例として、過度に巧妙な引数サイズ チェック Posixisnan
マクロは、C++0x のテンプレートです。ああ、悪い例ですが、あなたはその考えを理解します。
そのルールの主な例外は、基本的に高レベルの言語機能を実装するマクロです。たとえば、よりスマートな例外処理、共分散、パラメーター化された一連の宣言などです。
場合によっては、inline
関数またはテンプレートとして適切に表現できないマクロを、よりスマートな種類の前処理、つまりコード生成に置き換えることができます。次に、必要なコードを生成するスクリプトがどこかにあります。たとえば、純粋な C++ でマクロとテンプレートを使用してオプション クラスを作成することは可能ですが、それは複雑であり、理解しやすく、おそらくより保守しやすい代替手段として、必要なクラスを生成するスクリプトを追加のコストで使用することができます。ビルド手順と複数言語の処理。
乾杯 & hth.,