Size: a a a

2020 October 20

D

Danya in pro.cxx
Александр Караев
Вопрос по концептам.
Допустим, есть
template <class T> concept foo = ...;

Я его использую как
template <foo T>
void f(T& value);

Теперь я хочу, чтобы f принимала forwarding reference на T

Я могу написать
template <class T> requires foo<std::remove_cvref_t<T>>
void f(T&& value)

но это некрасиво. Как можно запихнуть эту конструкцию в <..>? В идеале, нужна композиция концептов, чтобы можно было шаблонизировать концепты концептами..  типа:
template <unref<foo> T>

Какие есть варианты решения?
Концепты не могут быть template template параметрами
источник

NV

Nik Vzdornov in pro.cxx
Ofee
Во всех найденных мной реализация использованы более сложные синтаксические конструкции, чем static_cast. Полагаю, это как-то связано с формулировкой стандарта:
The predicate condition for a template specialization is_convertible<From, To> shall be satisfied if and only if the return expression in the following code would be well-formed, including any implicit conversions to the return type of the function:
 To test() {
   return declval<From>();
 }
Но я, тем не менее не знаю, в чём принципиальное отличие этой функции от static_cast<To>(declval<From>()). На ум приходят какие-то мысли об RVO или поведении деструктора, но, кажется, мне не хватает понимания
Я может что-то не понял или забыл, но к примеру down cast не является implicit в то время как static_cast позволяет его сделать...
источник

АК

Александр Караев... in pro.cxx
Danya
Концепты не могут быть template template параметрами
это я понимаю, но возможно есть какие-то иные способы решить мою задачу элегантно
источник

КМ

Костя Мальованик... in pro.cxx
Всем привет подскажите пожалуйста как мне експортировать переопределённую функцию.  extern "C"  __declspec(dllexport) bool Execute(); - вот так не работает, проверяю через Dependency walker.  Спасибо
источник

АР

Андрей Руссков... in pro.cxx
в библиотеке должен стоять __declspec(dllexport), в пользователе - __declspec(dllimport)
источник

КМ

Костя Мальованик... in pro.cxx
Андрей Руссков
в библиотеке должен стоять __declspec(dllexport), в пользователе - __declspec(dllimport)
dependency walker должен же отображать експортированые ф-ции?
источник

АР

Андрей Руссков... in pro.cxx
еще не забывай что в си нет bool
источник

АР

Андрей Руссков... in pro.cxx
по крайней мере в msvc-шном точно не будет
источник

ПК

Побитый Кирпич... in pro.cxx
Андрей Руссков
еще не забывай что в си нет bool
В новом есть вроде
источник

АР

Андрей Руссков... in pro.cxx
ну в си20 есть
источник

АР

Андрей Руссков... in pro.cxx
емнип
источник

АР

Андрей Руссков... in pro.cxx
но msvc отказываются нововведения си поддерживать
источник

ПК

Побитый Кирпич... in pro.cxx
Андрей Руссков
ну в си20 есть
_Bool (since C99)
источник

ПК

Побитый Кирпич... in pro.cxx
это даже не новый
источник

AG

Anton Glukhov in pro.cxx
Привет народ! А подскажите как определить функцию , которая принимает ссылку на объект класса с шаблонной переменной?
template <std::size_t SIZE>
class Pattern

и хочу сделать функцию
int run_once(const Pattern &p);

Ругается, что: Use of class template 'Pattern' requires template arguments; argument deduction not allowed in function prototype. И это в принципе понятно, но не понятно как это обойти правильно.
источник

ПК

Побитый Кирпич... in pro.cxx
Anton Glukhov
Привет народ! А подскажите как определить функцию , которая принимает ссылку на объект класса с шаблонной переменной?
template <std::size_t SIZE>
class Pattern

и хочу сделать функцию
int run_once(const Pattern &p);

Ругается, что: Use of class template 'Pattern' requires template arguments; argument deduction not allowed in function prototype. И это в принципе понятно, но не понятно как это обойти правильно.
run_once тоже шаблонной должна быть
источник

ПК

Побитый Кирпич... in pro.cxx
template <std::size_t SIZE>
int run_once(const Pattern<SIZE> &p);
источник

AG

Anton Glukhov in pro.cxx
охх. а по другому никак? Тут еще хуже все… Эту функцию run_once хотел вызывать и plain C
источник

D

Danya in pro.cxx
Александр Караев
это я понимаю, но возможно есть какие-то иные способы решить мою задачу элегантно
Можно сделать обёртку
template <typename T>
struct foo_trait {
 constexpr static bool value = foo_concept<T>;
};
источник

AG

Anton Glukhov in pro.cxx
ну т.е. надо писать раппер, который принимает например классический enum. правильно?
источник