У меня есть дизайн, основанный на политике, где у меня есть некоторая функция, foo()
определенная в одних политиках, но не в других. Базовый класс всегда наследуется от некоторого класса с именем AlwaysBase
, который имеет подчиненную функцию foo()
.
Я хочу сделать так, чтобы, если существует лучший foo()
(один из класса Policy), он всегда выбирался.
Вот код:
// logic for determining if a class has a member function (not really related)
template <class> struct sfinae_true: std::true_type{};
template <class T> static auto test_foo(int) -> sfinae_true<decltype(std::declval<T>().foo())>;
template <class> static auto test_foo(long) -> std::false_type;
template <class T> struct has_foo : decltype(test_foo<T>(0)){};
class AlwaysBase{ public: void foo(){ cout << "in AlwaysBase foo()" << endl; } };
class BPolicy{};
class CPolicy{ public: void foo(){ cout << "in Cpolicy foo()" << endl; } };
template<typename T, typename ...Args>
class A: public T, public A<Args...>
{
public:
using std::conditional_t<has_foo<T>::value, T, AlwaysBase>::foo;
};
template<typename T>
class A<T>: public T, public AlwaysBase
{
public:
using std::conditional_t<has_foo<T>::value, T, AlwaysBase>::foo;
};
int main()
{
A<BPolicy> b;
b.foo(); // outputs: In AlwaysBase foo()
A<CPolicy> c;
c.foo(); // outputs: In CPolicy foo()
A<CPolicy, BPolicy> cb;
cb.foo(); // outputs: In CPolicy foo()
A<BPolicy, CPolicy> bc;
bc.foo(); // outputs: In AlwaysBase foo() // I WANT THIS TO OUTPUT!!!!: In CPolicy foo
}
Я понимаю, что здесь происходит, когда BPolicy
является первым, этот оператор using сначала используется в классе с переменными аргументами и затеняет любой предыдущий оператор using, который можно было бы найти в завершающем базовом классе (а именно CPolicy::foo).
Я хотел бы, чтобы порядок не имел значения при указании политик, и если у политики есть определитель, его всегда следует выбирать первым, а не AlwaysBase::foo
.
inline
... похоже, вы действительно не знали, что оно делает :-) - person Klaus   schedule 08.07.2020foo
? - person cigien   schedule 08.07.2020foo
, были там - person Tyler Kelly   schedule 08.07.2020foo()
и переопределите его в производном классе. Объявление использования не требуется, как в классическом шаблоне CRTP. - person SergeyA   schedule 08.07.2020