我想将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;
};
但是gcc
说templates may not be 'virtual'
。那么我如何将std::array
传递给我的函数?
答案 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)
(简单化)解释:
虚函数有效,因为每个类都维护该类的虚函数的地址表。
模板函数(或方法)不是代码,它是关于如何生成代码的说明。
所以这个:
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.
};