std :: array作为虚函数中的参数

时间:2015-04-27 12:45:49

标签: c++ arrays c++11

我想将std::array作为参数发送到我的虚拟功能

class Handler:
    {
    public:
        template <std::size_t N>
        virtual void handle(const std::array<char, N>& msg, std::vector<boost::asio::const_buffer>& buffers) = 0;
    };

但是gcctemplates may not be 'virtual'。那么我如何将std::array传递给我的函数?

3 个答案:

答案 0 :(得分:5)

成员函数模板可能不是虚拟的。请参阅this question

但是,您可以通过将std::array移至N来使虚拟成员函数获取特定大小的Handler

template <size_t N>
class Handler:
{
public:
    virtual void handle(const std::array<char, N>& msg,
        std::vector<boost::asio::const_buffer>& buffers) = 0;
};

或者简单地传递给定上下文的vector<char>可能更有意义:

class Handler:
{
public:
    virtual void handle(const std::vector<char>& msg,
        std::vector<boost::asio::const_buffer>& buffers) = 0;
};

答案 1 :(得分:2)

一种可能的解决方案是创建一个接受std::array的成员函数模板,并将其转发到您的虚拟成员函数,使得数组的大小作为普通函数参数传递而不是非类型模板参数。举例说明:

virtual void handle(const char* arr, std::size_t sz, std::vector<boost::asio::const_buffer>& buffers) = 0;

template <std::size_t sz>
void handle(const std::array<char, sz>& arr, std::vector<boost::asio::const_buffer>& buffers) {
  handle(sz ? &arr[0] : nullptr, sz, buffers);
}

答案 2 :(得分:0)

(简单化)解释:

  1. 虚函数有效,因为每个类都维护该类的虚函数的地址表。

  2. 模板函数(或方法)不是代码,它是关于如何生成代码的说明。

  3. 所以这个:

    template <std::size_t N>
    void handle(const std::array<char, N>& msg, std::vector<boost::asio::const_buffer>& buffers)
    {
       // stuff that looks like code
    }
    

    没有定义方法。它告诉编译器如何为N的每个和任何值编写不同的方法(函数)。

    在这种情况下:

    template <>
    void handle(const std::array<char, 10>& msg, std::vector<boost::asio::const_buffer>& buffers)
    

    template <>
    void handle(const std::array<char, 20>& msg, std::vector<boost::asio::const_buffer>& buffers)
    

    实际上是不同的功能(碰巧表现相似)。因为它们是不同的功能,它们将占用不同的地址。

    因此,为了使它们成为虚拟,虚拟功能表中必须有2个条目。

    例如,这可以起作用:

    class Handler:
        {
        public:
            virtual void handle(const std::array<char, 10>& msg, std::vector<boost::asio::const_buffer>& buffers) = 0;
    
            virtual void handle(const std::array<char, 20>& msg, std::vector<boost::asio::const_buffer>& buffers) = 0;
    
            // and so on for every value on N you need.
        };