例如,我有3个不同的对象a, b和c;每一个都是一个不同类的实例。我想声明一个函数,它将std::vector数组作为参数;其中向量数组是对象a、b或c(非混合)的数组。我该怎么做呢?
我代码://TODO: make this work for any vector array in the program;
bool assert_choice (std::vector<?> array) { //asserts that choice is valid
std::cout << "ohai" << std::endl;
return true;
}
我不确定如何声明参数
使用函数模板:
template< class T >
bool assert_choice( std::vector<T> array )
{
//...
}
您也可以考虑通过引用std::vector<T> &
或const std::vector<T> &
传递。
假设您使用a
, b
, c
作为示例,而不是您想要传递的仅类型,不要通过向量传递,而是通过迭代器对传递:
template <class Iter>
bool assert_choice (Iter first, Iter last) { ... }
使用这种方法,任何满足所需接口的类型都可以成功传递。
你可以为它创建一个类型trait:
#include <type_traits>
template <typename T, typename V = void>
struct is_type : std::false_type {};
template <typename T>
struct is_type<T, typename std::enable_if<std::is_same<T, A>::value
|| std::is_same<T, B>::value
|| std::is_same<T, C>::value
>::type
> : std::true_type {};
把你的类改成这样的模板。这样,只有当T
是A
, B
或C
类型时,它才会编译:
template <typename T,
typename std::enable_if<is_type<T>::value>::type* = nullptr>
bool assert_choice(std::vector<T>& var)
{
// ...
return true;
}