Я хотел бы проверить, является ли тип из определенного пространства имен. Вот что я придумал:
#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(){}
Это работает отлично, пока никто не добавляет adl_is_member_of_sample
в свое собственное пространство имен (или даже глобальное пространство имен). И, конечно, мне пришлось бы создать такую конструкцию для каждого пространства имен, которое я хочу проверить.
Есть ли лучший способ проверить во время компиляции, если тип относится к определенному пространству имен?
Обоснование или "Зачем мне это нужно":
В EDSL я проверяю свойства типа во время компиляции, чтобы убедиться, что определенные выражения действительны или нет. Некоторые из этих черт типа довольно просты: если класс имеет using is_numeric = void
, то я рассматриваю его как числовое выражение. Прекрасно работает.
is_numeric
довольно общий. Другие могут использовать его также. Поэтому я подумал о том, чтобы поддержать признак с проверкой того, что тип из ожидаемого пространства имен.