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

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

本文关键字:类型参数 函数 一个 何编写      更新时间:2023-10-16

我必须类:

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_vectordevice_vectorshared_vector都从中继承。

但不幸的是,device_vector代码不在我的控制之下。

我应该如何解决这个问题?

注意:我知道typeid(变量).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,将这两个测试包装在更具可读性的东西中。