如何编写一个接受不同类型参数的函数?

How to write a function which takes different type of arguments?

我必须 classes :

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

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

我想编写一个函数 f 来访问任何类型的对象,无论是类型 shared_vector 还是 device_vector 并相应地设置一些 flags

现在显而易见的解决方案是函数重载。但是假设函数 f 有 10 个参数,可以是 shared_vectordevice_vector, 我将不得不编写 1024 个重载函数。

另一种解决方案是使用 parent class hybrid_vector device_vectorshared_vector 都从中继承。

但不幸的是,device_vector代码不在我的控制范围内。

我该如何解决这个问题?

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

可能是接受 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 来稍微包装这两个测试更具可读性。