После this question с использованием ADL можно создать признак, чтобы ответить, если передаваемая тип исходит из нашего пространства имен:Можно ли создать признак, чтобы ответить, если тип поступает из std?
#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(){}
Из очевидных причин этого не может быть применен к std
имен - там просто нет способа впрыснуть adl_is_member_of_sample
эквивалентно пространству имен std
, не подвергая себя неопределенному поведению.
Есть ли способ обхода, который позволяет создать признак?
Это звучит как [ху проблемы] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). Зачем вам это нужно? –
Обратите внимание, что имя может быть в нескольких пространствах имен для целей ADL. 'std :: pair' находится в трех пространствах имен: std, foo и bar. –
@PeteBecker Проблема возникла [этот вопрос] (http://stackoverflow.com/questions/41867111/make-stds-data-structure-use-my-existing-non-static-hash-function-hashcode/41977680# 41977680), но мне больше любопытно, потому что я думаю, что для этого есть еще много приложений ... –