如何编写一个采用不同类型参数的函数?

时间:2016-03-20 18:13:27

标签: c++ inheritance overloading

我必须上课:

template <class T>
class shared_vector 
{
    T data;
}

template <class  T>
class device_vector
{
    T data;
}

我想编写一个函数f来加入任何类型的对象,无论是shared_vector还是device_vector类型,都会相应地设置一些标记

现在显而易见的解决方案是进行功能重载。但是假设函数f有10个参数,可以是shared_vectordevice_vector, 我必须编写1024个重载函数。

另一种解决方案是使用父类 hybrid_vector device_vectorshared_vector继承。

但遗憾的是,device_vector代码不在我的掌控之中。

我该如何解决这个问题?

注意:我知道typeid(变量).name()可以告诉类型,但是我的函数声明是什么以及如何从中推断出类型?

1 个答案:

答案 0 :(得分:2)

接受boost::variant<shared_vector<T>, device_vector<T>>可能是一种选择。

另一个选项是std::enable_if

template<typename V>
std:enable_if<
  std::same_type<V, shared_vector<decltype(V::data)>::value |
  std::same_type<V, device_vector<decltype(V::data)>::value ,
  void>::type
foo(V const& vector);

如果你有V1..V10仍然会很冗长,但它只是2 * 10次检查,而不是1024次。当然你可以编写自己的is_device_or_shared<Vector>::value来包装这两个测试更具可读性的东西。