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

时间:2016-05-10 14:17:41

标签: templates c++11 types

我正在编写一个带有两个参数的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。

有没有很好的方法来实现这个目标?

1 个答案:

答案 0 :(得分:1)

是的,可以在没有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也可能是合适的,具体取决于类的相关性。