For some reason I couldn't find many examples of how to use a parameter pack as a mixin, to enable different features with no runtime overhead. Here is a full example of you might implement this (be aware there are some nasal daemons in the code below!). The technique is really based on this one line:
int dummy[sizeof...(Config)] = { (Config::apply(p), 0)... };
This idiom will unpack a parameter pack and call T::apply, for each T in the parameter pack. You can use this idiom to build very clean mixin-type interfaces with static dispatch, or to build job security.
Full example:
struct EnableFeatureA {
template <typename T> static void apply(T *a) {
cout << a->a() << endl;
}
};
struct EnableFeatureB {
template <typename T> static void apply(T *a) {
cout << T::b() << endl;
}
};
template <typename Impl, typename... Config>
struct Foo {
Foo(){
// Call apply() for each type in Config
Impl *p = nullptr;
int dummy[sizeof...(Config)] = { (Config::apply(p), 0)... };
}
};
struct Bar;
using FwdFoo = Foo<Bar, EnableFeatureA, EnableFeatureB>;
struct Bar : FwdFoo {
int a() { return 4; }
static int b() { return 2; }
};