加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 07:16:26 所属栏目:百科 来源:网络整理
导读:我正在编写一个C 11模板函数void foo(T,U),它有两个参数: 第一个参数可以是A1类型或B1类型. 如果第一个参数是A1类型,则第二个参数是A2类型; 如果第一个参数是B1类型,则第二个参数是B2类型; 由于第二个参数取决于第一个参数,有没有办法编写这个函数只需要一
我正在编写一个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也可能是合适的,取决于类如何相关.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读