在C ++中,我如何声明一个将任何对象的向量数组作为一个agrument的函数?

时间:2013-06-10 00:24:39

标签: c++ arrays function arguments stdvector

例如,我有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;
}

我不确定如何声明参数。

3 个答案:

答案 0 :(得分:2)

使用功能模板:

template< class T >
bool assert_choice( std::vector<T> array )
{
    //...
}

您也可以考虑通过引用std::vector<T> &const std::vector<T> &传递。

答案 1 :(得分:1)

假设您使用abc作为示例,而不是您要传递的类型,请不要通过向量但由迭代器对:

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类型ABC时才会进行编译:

template <typename T,
          typename std::enable_if<is_type<T>::value>::type* = nullptr>
bool assert_choice(std::vector<T>& var)
{
    // ...
    return true;
}