例如,我有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;
}
我不确定如何声明参数。
答案 0 :(得分:2)
使用功能模板:
template< class T >
bool assert_choice( std::vector<T> array )
{
//...
}
您也可以考虑通过引用std::vector<T> &
或const std::vector<T> &
传递。
答案 1 :(得分:1)
假设您使用a
,b
,c
作为示例,而不是您要传递的仅类型,请不要通过向量但由迭代器对:
template <class Iter>
bool assert_choice (Iter first, Iter last) { ... }
使用此方法,可以成功传递满足所需接口的任何类型。
答案 2 :(得分:1)
您可以为此创建一个类型特征:
#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;
}