如何编写一个接受不同类型参数的函数?
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_vector
或 device_vector
,
我将不得不编写 1024 个重载函数。
另一种解决方案是使用 parent class hybrid_vector
device_vector
和 shared_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
来稍微包装这两个测试更具可读性。
我必须 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_vector
或 device_vector
,
我将不得不编写 1024 个重载函数。
另一种解决方案是使用 parent class hybrid_vector
device_vector
和 shared_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
来稍微包装这两个测试更具可读性。