(Преамбула: Я поздно последовал за игрой C ++ 0x, и недавние споры об удалении концепций из стандарта C ++ 0x побудили меня узнать о них больше. Хотя я понимаю что все мои вопросы полностью гипотетические - поскольку концепции не будут действительным кодом C ++ в ближайшее время, если вообще будут - мне все еще интересно узнать больше о концепциях, особенно с учетом того, как это поможет мне понять больше полностью обоснованы достоинства недавнего решения и последовавшие за этим споры)
Прочитав вводный материал по концепциям, которые предлагал C ++ 0x (до недавнего времени), у меня возникли проблемы с осмыслением некоторых синтаксических проблем. Без лишних слов, вот мои вопросы:
1) Будет ли тип, который поддерживает конкретную производную концепцию (неявно, с помощью ключевого слова auto или явно с помощью concept_maps), также должен поддерживать базовую концепцию независимо? Другими словами, включает ли процесс получения концепции из другого (например, concept B<typename T> : A<T>
) неявно «невидимое» выражение requires (внутри 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? Или для концептов, включающих в себя имена типов, необходима карта-концепт-карта?
3) Наконец, мне трудно понять, какие аксиомы можно было бы определить. Например, могу ли я задать концепцию, определяющую логически несовместимую аксиому, например
concept SomeConcept<typename T>
{
T operator*(T&, int);
axiom Inconsistency(T a)
{
a * 1 == a * 2;
}
}
Что бы это сделало? Это вообще действительно?
Я понимаю, что это очень длинный набор вопросов, и заранее благодарю вас.