在可变上下文中使用抽象 class 时如何实现抽象方法
How to implement an abstract method when abstract class is used in a variadic context
如何在以下代码中实现通用案例中的抽象基 class。该代码是从我正在处理的库中简化而来的。因此 int 和 double 的显式实现不是一种选择。
template <typename T>
struct Foo
{
virtual void send(T t) = 0;
};
template <typename...T>
struct Bar : Foo<T>...
{
void send(T t) override { // does not compile because
// abstract method not implemented
}
};
int main() {
// example usage
Bar<int, double> b;
b.send(1);
b.send(2.3);
}
非常感谢。
编辑:在抽象方法中添加了虚拟方法。
下面这个例子呢?
首先,我认为您需要在 Foo
中定义 virtual
send()
方法(如果您希望它是纯虚拟的)。
接下来,您可以声明一个中间模板 class (Foo2
),其中实现 override
send()
最后,您可以使用 Bar
中的模板 send()
方法来 select 正确的虚拟 send()
方法。
#include <iostream>
template <typename T>
struct Foo
{ virtual void send(T t) = 0; };
template <typename T>
struct Foo2 : Foo<T>
{
void send(T) override
{ std::cout << "sizeof[" << sizeof(T) << "] " << std::endl; }
};
template <typename...T>
struct Bar : Foo2<T>...
{
template <typename U>
void send (U u)
{ Foo2<U>::send(u); }
};
int main()
{
Bar<int, double> b;
b.send(1); // print sizeof[4]
b.send(2.3); // print sizeof[8]
}
如何在以下代码中实现通用案例中的抽象基 class。该代码是从我正在处理的库中简化而来的。因此 int 和 double 的显式实现不是一种选择。
template <typename T>
struct Foo
{
virtual void send(T t) = 0;
};
template <typename...T>
struct Bar : Foo<T>...
{
void send(T t) override { // does not compile because
// abstract method not implemented
}
};
int main() {
// example usage
Bar<int, double> b;
b.send(1);
b.send(2.3);
}
非常感谢。
编辑:在抽象方法中添加了虚拟方法。
下面这个例子呢?
首先,我认为您需要在 Foo
中定义 virtual
send()
方法(如果您希望它是纯虚拟的)。
接下来,您可以声明一个中间模板 class (Foo2
),其中实现 override
send()
最后,您可以使用 Bar
中的模板 send()
方法来 select 正确的虚拟 send()
方法。
#include <iostream>
template <typename T>
struct Foo
{ virtual void send(T t) = 0; };
template <typename T>
struct Foo2 : Foo<T>
{
void send(T) override
{ std::cout << "sizeof[" << sizeof(T) << "] " << std::endl; }
};
template <typename...T>
struct Bar : Foo2<T>...
{
template <typename U>
void send (U u)
{ Foo2<U>::send(u); }
};
int main()
{
Bar<int, double> b;
b.send(1); // print sizeof[4]
b.send(2.3); // print sizeof[8]
}