Size: a a a

2021 July 27

D

Devel29A in codingteam
Они к компилятору отношения не имеют вроде бы
источник

FO

FORTRAN ONE LOVE in codingteam
Они в смак пытались DPC++ протащить
источник

D

Devel29A in codingteam
вроде протащено давно
источник

D

Devel29A in codingteam
во всяком случае я собираю семплы шмейком
источник

FO

FORTRAN ONE LOVE in codingteam
Гм. Завернули их
источник

c

codingteam@cjr in codingteam
(<*>).(<*>)
подскажите, а я могу в c++ описать некий маппинг от типа в тип и использовать его в описании темплейта? вроде такого:

template <typename T, typename X = MapType(T)>
... ...()
{
 return f<T>(...);
}
источник

c

codingteam@cjr in codingteam
(<*>).(<*>)
опечатка, вот:

template <typename T, typename X = MapType(T)>
... ...()
{
return f<X>(...);
}
источник

c

codingteam@cjr in codingteam
(<*>).(<*>)
я не хочу указывать X вручную. но смотря на T я знаю какой будет X
источник

c

codingteam@cjr in codingteam
(<*>).(<*>)
более конкретно. вот есть у меня полиморфная функция:

template <typename A, template<typename>typename P = Parser>
P<A> map_parsing_failure(function<ParsingError(ParsingError)> map_fn, P<A> parser)
{
return P<A>{[=](auto input) {
 return visit(overloaded {
  [=](ParsingError err) -> ParsingResult<A, Input> { return map_fn(err); },
  [](ParsingSuccess<A, Input> x) -> ParsingResult<A, Input> { return x; }
 }, parser(input));
}};
}
источник

c

codingteam@cjr in codingteam
(<*>).(<*>)
вот видите тут Input, дело в том, что для разных P там разный тип должен быть. просто когда я вижу P = Parser, я знаю что это Input, а когда например у P = FromJsonParser, то там уже не Input будет, а JsonValue
источник

c

codingteam@cjr in codingteam
(<*>).(<*>)
для конкретного P, всегда конкретный этот тип должен быть. нет смысла его вручную писать
источник

c

codingteam@cjr in codingteam
(<*>).(<*>)
если не ошибаюсь, то условно то, что я хочу, называется — functional dependencies
источник

c

codingteam@cjr in codingteam
(<*>).(<*>)
пример на Haskell:

type family MapType (t :: Type) :: Type where
 MapType Parser = Input
 MapType FromJsonParser = JsonValue
источник

А⚙

Антон ⚙️ in codingteam
Через ассоциированный тип у обобщённой структуры. Всякие char_traits/iterator_traits из STL так работают
источник

c

codingteam@cjr in codingteam
(<*>).(<*>)
я хотел бы что-нибудь вроде этого, если бы это было возможно:

template <template<typename>typename T>
class ParserInput;

using ParserInput<Parser> = Input;
источник

c

codingteam@cjr in codingteam
(<*>).(<*>)
пытаюсь (пока без успеха) провернуть такое:

template <template<typename>typename T>
struct ParserInput;

template <>
struct ParserInput<Parser> { typedef Input ParserInputType; };

template <>
struct ParserInput<FromJsonParser> { typedef FromJsonInput ParserInputType; };

ParserInput<P> x;
... ParsingResult<A, decltype(x.ParserInputType)> { ... },
источник

c

codingteam@cjr in codingteam
(<*>).(<*>)
лол, кажется получилось
источник

c

codingteam@cjr in codingteam
(<*>).(<*>)
template <template<typename>typename T>
struct ParserInput;
template <>
struct ParserInput<Parser> { Input input_type; };
template <>
struct ParserInput<FromJsonParser> { FromJsonInput input_type; };
источник

c

codingteam@cjr in codingteam
(<*>).(<*>)
template <typename A, template<typename>typename P = Parser>
P<A> map_parsing_failure(function<ParsingError(ParsingError)> map_fn, P<A> parser)
{
ParserInput<P> x;
using I = decltype(x.input_type);
return P<A>{[=](auto input) {
 return visit(overloaded {
  [=](ParsingError err) -> ParsingResult<A, I> { return map_fn(err); },
  [](ParsingSuccess<A, I> x) -> ParsingResult<A, I> { return x; }
 }, parser(input));
}};
}
источник

c

codingteam@cjr in codingteam
(<*>).(<*>)
есть ли менее грязный способ провернуть подобное?
источник