( Преамбула: Я - поздний последователь игры C ++ 0x, и недавние разногласия относительно удаления концепций из стандарта C ++ 0x побудили меня узнать о них больше. Хотя Я понимаю, что все мои вопросы абсолютно гипотетичны, поскольку концепции в течение некоторого времени не будут действительным кодом C ++, если вообще будут, - мне все еще интересно узнать больше о концепциях, особенно учитывая, как это поможет мне лучше понять достоинства недавнего решения и последовавшие за этим споры)
После прочтения некоторых вводных материалов о концепциях, предложенных C ++ 0x (до недавнего времени), у меня возникли проблемы, связанные с некоторыми синтаксическими проблемами. Без лишних слов, вот мои вопросы:
1) Должен ли тип, поддерживающий конкретный производный концепт (либо неявно, через ключевое слово auto, либо явно через concept_maps), также поддерживать независимый базовый концепт? Другими словами, включает ли акт извлечения понятия из другого (например, concept B<typename T> : A<T>
) неявно выражение «невидимый», требующее (в пределах B, requires A<T>;
)? Путаница возникает на странице Википедии о понятиях, в которых говорится:
Как и в наследовании классов, типы, которые
соответствовать требованиям производного
Концепция также соответствует требованиям
базовая концепция.
Это, кажется, говорит о том, что тип должен удовлетворять только требованиям производной концепции, а не обязательно требованиям базовой концепции, что для меня не имеет смысла. Я понимаю, что Википедия далека от окончательного источника; приведенное выше описание - просто плохой выбор слов?
2) Может ли понятие, в котором перечислены типы, быть «автоматическим»? Если это так, как компилятор будет автоматически сопоставлять эти имена типов? Если нет, есть ли другие случаи, когда было бы недопустимо использовать «концепт» для концепта?
Для уточнения рассмотрим следующий гипотетический код:
template<typename Type>
class Dummy {};
class Dummy2 { public: typedef int Type; };
auto concept SomeType<typename T>
{
typename Type;
}
template<typename T> requires SomeType<T>
void function(T t)
{}
int main()
{
function(Dummy<int>()); //would this match SomeType?
function(Dummy2()); //how about this?
return 0;
}
Будет ли один из этих классов соответствовать SomeType? Или concept_map необходим для понятий, включающих имена типов?
3) Наконец, мне трудно понять, какие аксиомы можно было бы определить. Например, могу ли я иметь концепцию определения аксиомы, которая является логически несовместимой, например,
concept SomeConcept<typename T>
{
T operator*(T&, int);
axiom Inconsistency(T a)
{
a * 1 == a * 2;
}
}
Что бы это делало? Это даже верно?
Я ценю, что это очень длинный набор вопросов, поэтому заранее благодарю.