【问题标题】:In C++, how can I declare a function that takes a vector array of any object as an agrument?在 C++ 中,如何声明一个将任何对象的向量数组作为参数的函数?
【发布时间】:2013-06-10 00:24:39
【问题描述】:

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

我不确定如何声明参数。

【问题讨论】:

    标签: c++ arrays function arguments stdvector


    【解决方案1】:

    使用函数模板:

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

    您也可以考虑通过引用传递std::vector&lt;T&gt; &amp;const std::vector&lt;T&gt; &amp;

    【讨论】:

    • 迭代器对也可能是个好主意。然后它可以使用任何序列容器,而不仅仅是一个向量。
    • @OliCharlesworth 尚不完全清楚他们的意图是什么,但问题标题指出“任何对象”,并且没有提及将其限制为 only 类型 ABC
    • @paddy:啊,也许吧。标题说明了一件事,但问题主体说“向量数组是对象a、b或c的数组”。谁知道真正的要求是什么......
    • @OliCharlesworth 没错。所以我试图解决他们的主要问题并保持简单,直到另有指示=)
    【解决方案2】:

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

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

    通过这种方式,任何满足所需接口的类型都可以成功传递。

    【讨论】:

      【解决方案3】:

      您可以为此创建类型特征:

      #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 {};
      

      并更改您的班级以采用这样的模板。这样它只会在TABC 类型时编译:

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

      【讨论】:

        猜你喜欢
        • 2021-09-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多