Условное наследование от любого из двух классов


person Masked Man    schedule 08.12.2012    source источник
comment
не могли бы вы объяснить, почему я получил отрицательные голоса за то, что поделился своими знаниями с сообществом после того, как не нашел их здесь?   -  person Masked Man    schedule 08.12.2012
comment
en.cppreference.com/w/cpp/types/conditional (но я на самом деле не вижу здесь причин для отрицательных голосов. Я надеюсь, что вы внимательно прочитали все ответы на связанный вопрос.)   -  person Mat    schedule 08.12.2012
comment
Я могу понять минусы ответа, но почему минусы вопроса? Похоже, если бы я просто задал вопрос, не ответив на него, я бы не получил ни одного отрицательного голоса (а мог бы даже получить плюс). Я действительно не знал о std::conditional и не нашел его после поиска conditional inheritance from either of two base classes ни здесь, ни в Интернете, что плохого в том, чтобы спросить?   -  person Masked Man    schedule 08.12.2012
comment
Поскольку это дубликат многих других вопросов здесь, вы также можете удалить его, на мой взгляд. Не вижу пользы для общества.   -  person David Heffernan    schedule 08.12.2012
comment
А, теперь вижу. Это был не вопрос С++ 11. Если вы все еще настаиваете на том, что это не имеет никакой ценности, я удалю это. Спасибо, что указали на другие посты.   -  person Masked Man    schedule 08.12.2012
comment
Ну, я не вижу, что это не вопрос С++ 11. Вы не сказали иначе. Но дело не в этом. Это все еще дубликат многих других вопросов. Тот факт, что многие ответы включают std::conditional, является свойством ответа. И не вопрос. Для pre C++11 у вас есть boost::conditional.   -  person David Heffernan    schedule 08.12.2012
comment
О, мои извинения за это. Теперь добавил тег C++03, а также включил его в сообщение.   -  person Masked Man    schedule 08.12.2012


Ответы (1)


Я нашел решение, используя шаблоны и частичную специализацию. Код ниже делает свое дело:

// provide both the required types as template parameters
template<bool condition, typename FirstType, typename SecondType>
class License {};

// then do a partial specialization to choose either of two types 
template<typename FirstType, typename SecondType>
class License<true, FirstType, SecondType> {
public:    typedef FirstType TYPE;     // chosen when condition is true
};

template<typename FirstType, typename SecondType>
class License<false, FirstType, SecondType> {
public:    typedef SecondType TYPE;    // chosen when condition is false
};

class Standard {
public:    string getLicense() { return "Standard"; }
};

class Premium {
public:    string getLicense() { return "Premium"; }
};

const bool standard = true;
const bool premium = false;

// now choose the required base type in the first template parameter
class User1 : public License<standard, Standard, Premium>::TYPE {};
class User2 : public License<premium, Standard, Premium>::TYPE {};

int main() {
    User1 u1;
    cout << u1.getLicense() << endl;   // calls Standard::getLicense();
    User2 u2;
    cout << u2.getLicense() << endl;   // calls Premium::getLicense();
}

Синтаксис выглядит нечистым, но результат чище, чем при использовании директивы препроцессора.

person Masked Man    schedule 08.12.2012
comment
Поздравляем, вы заново изобрели std::conditional. - person ipc; 08.12.2012
comment
ладно. Я не знал об этом. Как я уже сказал, я не нашел его поиском. - person Masked Man; 08.12.2012
comment
Если можно добавить, я заново изобрел std::conditional в C++03. :) Спасибо что подметил это. Это мотивирует меня в ближайшее время прочитать больше о C++11. - person Masked Man; 08.12.2012