gpt4 book ai didi

templates - 根据模板参数选择参数类型

转载 作者:行者123 更新时间:2023-12-02 22:19:38 27 4
gpt4 key购买 nike

我正在编写一个带有两个参数的 C++11 模板函数 void foo(T, U):

第一个参数可以是A1类型或B1类型。如果第一个参数为A1类型,则第二个参数为A2类型;如果第一个参数为B1类型,则第二个参数为B2类型;

由于第二个参数依赖于第一个参数,有没有一种方法可以编写只需要一个模板参数的函数?

类似的东西

template class <T>
void foo(T t, std::conditional<A1* tmp = dynamic_cast<T*>(&t), A2, B2>::type);

可能有用,但它很难看并且需要 RTTI。

有什么好的方法可以实现这一点吗?

最佳答案

是的,无需 RTTI 即可完成。如何最好地做到这一点取决于 A1 和 A2 的关系。

如果你控制类,你可以在 A1 中添加 using 或 typedef

class A1
{
using RelatedType = A2;
}

B1 和 B2 类似

然后

template class <T>
void foo(T t, T::RelatedType t2);

如果你无法编辑 A1,你可以创建一个类型特征

template<typename T>
struct TypeRelation // would have a better name if we knew why they were related
{
// can put a default related type here if you want
}

然后使用模板专门化(例如 As,但 Bs 需要类似)

template<>
struct TypeRelation<A1>
{
using RelatedType = A2;
}

然后声明就变成了

template class <T>
void foo(T t, typename TypeRelation<T>::RelatedType t2);

C++11s decltype 也可能适用,具体取决于类的相关方式。

关于templates - 根据模板参数选择参数类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37141186/

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