如何编写一个接受不同类型参数的函数
How to write a function which takes different type of arguments?
我必须类:
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()可以告诉类型,但是我的函数声明是什么,我如何从中推断类型?
接受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
,将这两个测试包装在更具可读性的东西中。
相关文章:
- 在 c++ 中的模板实例化中使用带有构造函数的类作为类型参数
- 如何在 c++ 中定义接受不同参数类型的函数向量?
- 函数类型参数的模板参数推导
- 基于类型作为参数的字符串表示形式具有不同返回类型的函数
- PowerShell 使用结构类型参数调用 C++ DLL 的导出函数
- 通过引用传递参数;函数返回类型是否必须为 VOID?
- 参数数据类型未知的可变参数函数
- 使用其他模板类型参数作为要在函数签名中使用的类型别名声明
- 如何避免具有相同类型参数的函数中的错误
- 将内置类型变量传递给只有一个类类型参数的"+"运算符函数时自动类型转换的构造函数
- 使用返回不完整类型的函数作为默认参数
- 迭代器的模板参数:函数在调用时推断类型?
- EXPECT_CALL具有 unique_ptr 引用类型参数的模拟函数
- 是否可以使用泛型枚举类型作为函数的参数?
- 如何动态加载和调用具有特定于库的类型作为函数参数的符号
- SFINAE 和模板函数实例化:为什么在启用了 SFINAE 类型的函数参数中使用模板参数时无法推断模板参数?
- 使用模板将任意类型参数传递给 C++ 中的函数
- 具有可变参数类型参数的可变参数函数
- C++ 如何将参数绑定到具有相同返回类型的函数,并将它们全部存储在一个容器中
- 具有非模板类型参数的模板函数的重载解析