Nach this question von ADL eine Verwendung eines Merkmals erstellen kann zu beantworten, wenn der übergebene Typ aus unserem Namespace kommt:Ist es möglich, ein Merkmal zu erstellen, um zu antworten, ob ein Typ von std kommt?
#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(){}
Aus ersichtlichen Grund dieser kann nicht auf den std
Namespace angewendet werden - es gibt einfach keine Möglichkeit, das zu injizieren adl_is_member_of_sample
entspricht dem Namespace std
, ohne sich einem undefinierten Verhalten auszusetzen.
Gibt es eine Abhilfe ermöglicht das Merkmal zu schaffen?
Das klingt wie ein [xy Problem] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). Warum musst du das tun? –
Beachten Sie, dass ein Name für ADL-Zwecke in mehreren Namespaces enthalten sein kann. 'std :: pair' ist in drei Namespaces - std, foo und bar. –
@PeteBecker Das Problem hat Ursprung [diese Frage] (http://stackoverflow.com/questions/41867111/make-stds-data-structure-use-my-existing-non-static-hash-function-hashcode/41977680# 41977680), aber ich bin mehr gespannt, weil ich denke, es gibt viele weitere Anwendungen für sie ist ... –