如何在可变参数派生 class 中执行来自 crtp base classes 的所有函数?
How to execute all functions from crtp base classes in a variadic derived class?
我有一个 CRTP 派生的 class,它是它可以继承的所有 CRTP 基础 classes 的可变参数模板。我想在派生的 class(printAll 函数)的方法中从每个继承的 class(在本例中为 print 函数)执行一个函数。我怎样才能做到这一点?
// Base Class 1
template<typename Derived>
struct Mult
{
void print()
{
int a = (static_cast<Derived const&>(*this)).m_a;
int b = (static_cast<Derived const&>(*this)).m_b;
std::cout << "a * b: " << a * b << "\n";
}
};
// Base Class 2
template<typename Derived>
struct Add
{
void print()
{
int a = (static_cast<Derived const&>(*this)).m_a;
int b = (static_cast<Derived const&>(*this)).m_b;
std::cout << "a + b: " << a + b << "\n";
}
};
template<template<typename> typename... Bases>
struct Derived : public Bases<Derived<Bases...>>...
{
int m_a, m_b;
Derived(int a, int b) : m_a(a), m_b(b) {}
void printAll()
{
// Should execute the print method of all the derived classes
this->print();
}
};
int main()
{
Derived<Mult, Add> d(2, 3);
// should print:
// a + b: 5
// a * b: 6
d.printAll();
}
void printAll()
{
auto _ = {(Bases<Derived<Bases...>>::print(), 0) ...};
}
您可以使用 fold expression,C++17 中的一项新语言功能:
void printAll()
{
(Bases<Derived>::print(), ...);
}
我有一个 CRTP 派生的 class,它是它可以继承的所有 CRTP 基础 classes 的可变参数模板。我想在派生的 class(printAll 函数)的方法中从每个继承的 class(在本例中为 print 函数)执行一个函数。我怎样才能做到这一点?
// Base Class 1
template<typename Derived>
struct Mult
{
void print()
{
int a = (static_cast<Derived const&>(*this)).m_a;
int b = (static_cast<Derived const&>(*this)).m_b;
std::cout << "a * b: " << a * b << "\n";
}
};
// Base Class 2
template<typename Derived>
struct Add
{
void print()
{
int a = (static_cast<Derived const&>(*this)).m_a;
int b = (static_cast<Derived const&>(*this)).m_b;
std::cout << "a + b: " << a + b << "\n";
}
};
template<template<typename> typename... Bases>
struct Derived : public Bases<Derived<Bases...>>...
{
int m_a, m_b;
Derived(int a, int b) : m_a(a), m_b(b) {}
void printAll()
{
// Should execute the print method of all the derived classes
this->print();
}
};
int main()
{
Derived<Mult, Add> d(2, 3);
// should print:
// a + b: 5
// a * b: 6
d.printAll();
}
void printAll()
{
auto _ = {(Bases<Derived<Bases...>>::print(), 0) ...};
}
您可以使用 fold expression,C++17 中的一项新语言功能:
void printAll()
{
(Bases<Derived>::print(), ...);
}