1

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

我不确定如何声明论点。

4

3 回答 3

2

使用函数模板:

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

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

于 2013-06-10T00:27:34.300 回答
1

假设您使用a, b,c作为示例而不是您要传递的唯一类型,请不要通过向量而是通过迭代器对传递:

template <class Iter>
bool assert_choice (Iter first, Iter last) { ... }

使用这种方法,任何满足所需接口的类型都可以成功传递。

于 2013-06-10T00:33:39.197 回答
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是类型AB或者C

template <typename T,
          typename std::enable_if<is_type<T>::value>::type* = nullptr>
bool assert_choice(std::vector<T>& var)
{
    // ...
    return true;
}
于 2013-06-10T00:38:59.547 回答