我必须上课:
template <class T>
class shared_vector
{
T data;
}
template <class T>
class device_vector
{
T data;
}
我想编写一个函数f来加入任何类型的对象,无论是shared_vector
还是device_vector
类型,都会相应地设置一些标记。
现在显而易见的解决方案是进行功能重载。但是假设函数f有10个参数,可以是shared_vector
或device_vector
,
我必须编写1024个重载函数。
另一种解决方案是使用父类 hybrid_vector
device_vector
和shared_vector
继承。
但遗憾的是,device_vector代码不在我的掌控之中。
我该如何解决这个问题?
注意:我知道typeid(变量).name()可以告诉类型,但是我的函数声明是什么以及如何从中推断出类型?
答案 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
来包装这两个测试更具可读性的东西。