gpt4 book ai didi

c++ - 如何获取模板类的命名空间?

转载 作者:行者123 更新时间:2023-12-01 14:20:23 33 4
gpt4 key购买 nike

我想写一个模板类:

template<class A>
class B{/*class B code*/};

类 A 在各种命名空间中,例如:

namespace ns1{
class X{/*class X code*/};
class A{/*class A code*/};
}
namespace ns2{
class X{/*class X code*/};
class A{/*class A code*/};
}

现在如何在 B 中的某处访问与 A 相同命名空间中的类 X?

最佳答案

Now how to access class X in the same namespace as A somewhere inside B?

你不知道。无法获取类型、提取其 namespace 并通过组合该 namespace 和名称来构建新的类型名称。

如果您需要 B 模板能够访问与模板参数给定的类型关联的某个类,那么该关联应该是明确的,某种方式的类型接口(interface)的一部分,而不是基于任意命名约定。

指定此类事物的两种传统机制是成员类型别名或特征类:

//Member alias
template<class A>
class B{
/* typename A::X is required to be an alias for the class associated with `A`.
};

namespace ns1{
class U{/*class U code*/};
class A{ using X = U;};
}

//traits
//Default implementation
template<class A>
class A_traits
{
using X = typename A::X; //By default, assume that `A` provides a member typedef.
};

template<class A>
class B{
/* typename A_traits<A>::X is required to be an alias for the class associated with `A`.
};

namespace ns1{
class U{/*class U code*/};
class A{}; //Doesn't provide the default.
}

//Specialization for `ns1::A`. Must be declared in the same namespace as the primary `A_traits` namespace
template<>
class A_traits<ns1::A>
{
using X == ns1::U;
};

traits 机制更复杂,但它适用于您无法控制的类型以及基本类型,如 int 和指针。

关于c++ - 如何获取模板类的命名空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61030188/

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