タイプが特定のネームスペースのものかどうかを確認したいと思います。これは、限り誰もが自分の名前空間(あるいはグローバル名前空間)へadl_is_member_of_sample
を追加しないと正常に動作しますタイプが特定のネームスペースのものかどうか確認してください
#include <utility>
namespace helper
{
template <typename T, typename = void>
struct is_member_of_sample : std::false_type
{
};
template <typename T>
struct is_member_of_sample<
T,
decltype(adl_is_member_of_sample(std::declval<T>()))> : std::true_type
{
};
}
namespace sample
{
template <typename T>
auto adl_is_member_of_sample(T &&) -> void;
}
// -- Test it
namespace sample
{
struct X;
}
struct Y;
static_assert(helper::is_member_of_sample<sample::X>::value, "");
static_assert(not helper::is_member_of_sample<Y>::value, "");
int main(){}
:ここに私が思い付いたものです。もちろん、テストしたい名前空間ごとにそのような構造を作成する必要があります。
タイプが特定の名前空間のものであるかどうかをコンパイル時に確認する方法はありますか?
理由または「なぜ私が欲しいでしょうが、その」:
EDSLでは、私は特定の表現が有効であるかどうかを確認するために、コンパイル時に型の特徴をチェックしています。これらの型特性のいくつかはかなりシンプルです:クラスにusing is_numeric = void
がある場合、それを数値式として扱います。正常に動作します。
is_numeric
はかなり一般的です。他の人もそれを使うかもしれない。そこで私は、型が予想される名前空間のものであるかどうかをチェックすることで、その特性を裏付けることを考えました。
このソリューションは非常に邪魔です。これをライブラリに入れるために、namespaceを定義するためのマクロを作成すると思います。 'namespace xxx {'の後ろに 'adl_is_member_of_sample()'を設定します。 – Lingxi
ちなみに、is_member_of_sampleテンプレートで使用したテクニックの名前はありますか? – Lingxi
@ Lingxi SFINAE。 –