gpt4 book ai didi

c++ - 为命名空间中的类特化方法模板

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:49:17 25 4
gpt4 key购买 nike

我正在使用以下编译时“技巧”(基于 ADL)来创建一个仅由同一命名空间中的类有效/定义/调用的函数。

    namespace Family1
{
struct ModelA{};
struct ModelB{};

template<typename T>
bool is_in_Family1(T const& t)
{
return true;
}
};

namespace Family2
{
struct ModelC{};

template<typename T>
bool is_in_Family2(T const& t)
{
return true;
}
};


Family1::ModelA mA;
Family2::ModelC mC;

is_in_Family1(mA); // VALID
is_in_Family1(mC); // ERROR

现在,我想使用这个原则(或类似的东西)来为属于每个命名空间的类生成 Foo::Bar(如下)的特化,例如家庭 1

    // I would like to specialize the method template Bar for classes in Family1 
// namespace; and another specialization for classes in Family2 namespace
struct Foo
{
template<typename T>
void Bar( T& _T ){}
};

为了便于维护和每个命名空间中的大量类,如果可能的话,我希望在执行此检查时不命名命名空间中的所有类。

最佳答案

你的“把戏”有一个大问题。尝试调用 is_in_Family1(make_pair(Family1::ModelA(), Family2::ModelC())你会看到返回 true ,因为 ADL 将查看 ModelA 的两个命名空间和 ModelC (因为 pair<ModelA, ModelC> )。

忽略这个问题,使用你的函数很简单。

template<typename T> struct int_ { typedef int type; };

struct Foo
{
template<typename T,
typename int_<decltype(is_in_Family1(*(T*)0))>::type = 0
>
void Bar( T& t ){}

template<typename T,
typename int_<decltype(is_in_Family2(*(T*)0))>::type = 0
>
void Bar( T& t ){}
};

调用 Bar取决于它是在 family2 还是 family1。

struct Foo
{
template<typename T,
typename int_<decltype(is_in_Family1(*(T*)0))>::type = 0
>
void Bar( T& t, long){}

template<typename T,
typename int_<decltype(is_in_Family2(*(T*)0))>::type = 0
>
void Bar( T& t, long){}

template<typename T>
void Bar( T& t, int) {}

template<typename T>
void Bar( T& t ) { return Bar(t, 0); }
};

那个也有一个通用的后备。并且您的代码具有未定义的行为,因为您使用了保留名称。不要使用 _T .

关于c++ - 为命名空间中的类特化方法模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9007584/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com