2016-10-30 2 views
9

Возможно ли использовать typedef или using, чтобы объявить псевдоним типа внутри концепции, как это предлагается концепциями TS? Если я пытаюсь что-то вроде следующего MWE, код не компилируется (с GCC 6.2.1 и переключателем -fconcepts)C++ concept lite и объявление псевдонима типа

#include <type_traits> 

template<typename T> 
concept bool TestConcept() 
{ 
    return requires(T t) 
    { 
     using V = T; 
     std::is_integral<V>::value; 
    }; 
} 

int main() 
{ 
    return 0; 
} 

ошибки Итоговой:

main.cpp: In function ‘concept bool TestConcept()’: 
main.cpp:8:9: error: expected primary-expression before ‘using’ 
     using V = T; 
     ^~~~~ 
main.cpp:8:9: error: expected ‘}’ before ‘using’ 
main.cpp:8:9: error: expected ‘;’ before ‘using’ 
main.cpp:4:14: error: definition of concept ‘concept bool TestConcept()’ has multiple statements 
concept bool TestConcept() 
       ^~~~~~~~~~~ 
main.cpp: At global scope: 
main.cpp:11:1: error: expected declaration before ‘}’ token 
} 
^ 
+0

Похоже, что вы хотите использовать 'typedef V T;', который будет иметь псевдоним 'T' to' V'. 'использование' предназначен для вызова пространств имен или определенных идентификаторов из пространства имен. Вот пример: http://stackoverflow.com/questions/10103453/is-typedef-inside-of-a-function-body-a-bad-programming-practice –

+1

@JamesMurphy извините, но так как C++ 11 вы можете используйте ключевое слово 'use', чтобы выразить псевдонимы типов, как вы делали это раньше, с помощью' typedef'. Вот ссылка: http://en.cppreference.com/w/cpp/language/type_alias. – erikzenker

+0

@JamesMurphy пример также терпит неудачу с typedef, в основном с тем же сообщением об ошибке. Как сказал erikzenker, синтаксис должен быть эквивалентным в наши дни. – Slizzered

ответ

2

No. Согласно концепции TS , является требованием:

requirement:
    simple-requirement
    type-requirement
    compound-requirement
    nested-requirement

Если простого требования является экспресса ион, а затем ; и типовое требование что-то вроде typename T::inner. Остальные два звучат так, как следует из названия.

Алиас типа является декларацией, а не выражением, и поэтому не соответствует требованию требования.

+0

Это кажется излишне ограничивающим для меня. Знаете ли вы, существует ли разумное обходное решение вместо того, чтобы писать один и тот же сложный тип снова и снова? – Slizzered

2

This feels unnecessarily restrictive to me. Do you know if there exists a reasonable workaround instead of writing the same complicated type over and over again?

Вы можете отложить выполнение ограничений на другую концепцию, передавая эти типы в качестве параметров шаблона:

template<typename Cont, typename It, typename Value> 
concept bool InsertableWith = requires(Cont cont, It it, Value value) { 
    // use It and Value as much as necessary 
    cont.insert(it, std::move(value)); 
}; 

template<typename Cont> 
concept bool Insertable = requires { 
    // optional 
    typename Cont::const_iterator; 
    typename Cont::value_type; 
} && InsertableWith<Cont, typename Cont::const_iterator, typename Cont::value_type>; 

Если вы планируете делать это, я предлагаю вам попробовать его на простых примерах, прежде чем сделать решение. Как вы пишете свои концепции и ограничения, определяет, как компилятор будет сообщать о ошибках и, конечно, иметь хорошие ошибки, является большой частью того, что делает концепты полезными. Упрощение написания моих понятий при усложнении понимания ошибок - это не компромисс, который я бы сделал легкомысленно.

Например, поэтому я излишне добавил typename Cont::const_iterator; как явное ограничение. Это дает компилятору возможность сообщить об этом типе. Я также был осторожен в выборе InsertableWith в качестве названия концепции: я мог бы просто просто уйти с detail::Insertable, но ошибки, связанные как с Insertable, так и с detail::Insertable, могли быть более запутанными в результате.

Наконец, обратите внимание, что все это зависит от качества реализации компилятора, поэтому я не ожидаю, что какой-либо подход будет окончательным на данный момент. Я рекомендую играть с этим Coliru demo.

Смежные вопросы