在c++中,如何声明一个接受任意对象的向量数组作为协议的函数



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

把你的类改成这样的模板。这样,只有当TA, BC类型时,它才会编译:

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

相关内容

  • 没有找到相关文章

最新更新