2016-11-30 3 views
0

К сожалению, единственный учебник, который я нашел около concepts, был учебным пособием по концепции (и он был действительно базовым). И даже с технической спецификацией существует некоторая функция подписи, которую я не знаю, как перевести на понятия (может быть, только потому, что мой английский плохой, и я не могу хорошо прочитать техническую спецификацию).Концепции C++: преобразование функций некоторых подписей

Так есть список функций подписи я до сих пор не знаю, как "перевести":

CFoo -> класс CFoo {};

  • void Foo1() const;
  • CFoo& Foo2();
  • void Foo3(CFoo&);
  • {static, friend, ... } void Foo4();
  • template < typename ... Args > void Foo5(Args && ... args);

Я хочу иметь некоторый интерфейс для класса с этими функциями. Даже не знаю, возможно ли это на данный момент. Foo2 и Foo3, похоже, та же проблема.


Честно говоря, я действительно хочу знать Foo2 и Foo5.

Я попробовал нечто, для Foo2, но я не имею ни малейшего представления о Foo5:

class Handle {}; 

template < typename Object > 
concept bool C_Object = 
    requires(Handle handle) { 
    {get(handle)} -> Object& 
    }; 

template < C_Object Object > 
class Foo { 

    Object obj; 
}; 

int main() { 

    Foo<int> test; 
    return 0; 
} 

Я знаю, что это не будет компилироваться, потому что Foo не имеют ПОЛУЧИТЬ menber, но они не являются правильные ошибки:

Test1.cpp:6:16: error: there are no arguments to ‘get’ that depend on a template parameter, so a declaration of ‘get’ must be available [-fpermissive] 
    {get(handle)} -> Object& 
       ^
Test1.cpp:6:16: note: (if you use ‘-fpermissive’, G++ will accept your code, but allowing the use of an undeclared name is deprecated) 
Test1.cpp: In function ‘int main()’: 
Test1.cpp:18:10: error: template constraint failure 
    Foo<int> test; 
     ^
Test1.cpp:18:10: note: constraints not satisfied 
Test1.cpp:4:14: note: within ‘template<class Object> concept const bool C_Object<Object> [with Object = int]’ 
concept bool C_Object = 
       ^~~~~~~~ 
Test1.cpp:4:14: note:  with ‘Handle handle’ 
Test1.cpp:4:14: note: the required expression ‘get(handle)’ would be ill-formed 

Если кто-то может указать мне некоторые ресурсы или, почему бы нет, решение. Это будет замечательно.

великий день

ответ

2

Я знаю, что это не будет компилироваться, потому что Foo не имеют ПОЛУЧИТЬ menber [...]

Concepts дело с нормальными выражениями. В частности, объем выражений requires является обычной областью, а не областью класса. Это может быть более очевидной в связи с этим понятием:

template<typename Lhs, typename Rhs> 
concept bool Addable = requires(Lhs lhs, Rhs rhs) { 
    lhs + rhs; 
}; 

Addable<int, long> выполняется потому, что данный int lhs; long rhs; то lhs + rhs является допустимым выражением. Мы используем встроенный оператор добавления для двух (притворяющихся) переменных, которые мы явно вводим в список параметров, не вызываем член operator+ на неявный *this.

Концепции касаются интерфейсов в более широком смысле (как в API), а не в более узком смысле ООП. Вы можете думать о Addable как отношение к парам типов. То, что Addable<int, long> трюмов не означает, int сам по себе имеет особые отношения с Addable.Верно, что Addable может использоваться, например.

template<Addable<long> Var> 
struct client { 
    Var var; 
}; 

, а затем client<int> поставляется с Addable<int, long> ограничения, но это ярлык синтаксический характер. Это полезный способ разрезания шаблона, а именно избавление нас от написания template<typename Var> requires Addable<Var, long>.

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

template<typename Obj> 
concept bool Object = requires(Obj obj, Obj const cobj, Handle handle) { 
    cobj.Foo1(); 
    { obj.Foo2() } -> Obj&; 
    obj.Foo3(obj); 
    // static 
    Obj::Foo4(); 
    // non-member, possibly friend 
    Foo4(obj); 

    { obj.get(handle) } -> Obj&; 
}; 

(I опущены в Foo5 сценарий, потому что это стоит его собственный вопрос, вот lead.)

+0

Вы правы, я был ослеплен концепцией и классом. Большое спасибо. Я попробую это и закрою вопрос, если вы считаете, что Foo5 слишком выходит за рамки. –