我正在编写一个带有两个参数的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。
有没有很好的方法来实现这个目标?
答案 0 :(得分:1)
是的,可以在没有RTTI的情况下完成。如何做到最好取决于A1和A2的相关性。
如果您控制类,可以在A1
中添加using或typedefclass 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也可能是合适的,具体取决于类的相关性。