- число float, T = float)
компилятор ругался что не хватает template
268:8: error: missing 'template' keyword prior to dependent template name 'value'
ну я и поставил:
s.template value<sizeof(T)>(el);
теперь не ругается, собирается код без проблем.
что за дичь?? никогда не видел такого синтаксиса и вот опять
кусочек с определением прилагаю (либа bitsery):
template<typename TInputAdapter, typename TContext = void>
class Deserializer
: public details::AdapterAndContextRef<TInputAdapter, TContext>
{
public:
template<size_t VSIZE, typename T>
void value(T& v)
{
static_assert(details::IsFundamentalType<T>::value,
"Value must be integral, float or enum type.");
using TValue = typename details::IntegralFromFundamental<T>::TValue;
this->_adapter.template readBytes<VSIZE>(reinterpret_cast<TValue&>(v));
}
// other methods.....
};
Смысл приблизительно тот же, что и в использовании typename перед details в примере: помочь компилятору определить, что за сущность называется. readBytes могло не быть шаблоном и выражение осталось бы полностью валидным синтаксически: this->_adapter.readBytes < VSIZE > (reinterpret_cast<TValue&>(v)); Edit: Это (порой) требуется, когда рассматриваемое имя зависимое (т.е. как-то зависит от инстанцирования текущего шаблона).
вкратце- внутри метода используется такой синтаксис, поэтому требуется template?
Внутри шаблона и относительно зависимой от него сущности (this), да.
аа, понял. неизвестно что за сущность _adapter и есть ли у него шаблонный метод
Так может быть и без такого адаптера, например, при наследовании от параметра шаблона его шаблонные функции также приходится вызывать.
У меня похожее есть, но я сделал отдельный traits is_binary_serialisable<T>, который можно руцями прописать где надо. Также добавляется sized_container для binary_serializable T
зачем? можно подробнее, в лс
Ну у них там стоит ассерт IsFundamentalType. А если struct foo{ int a; int b; }; Обидно же. Оно не фундаментальное, но в поток пишется на ура. Поэтому снизу подписываешь inline constexpr bool is_binary_serializable<foo> = true; И все пишется как родное.
is_binary_serializable, я так понимаю, не родное, и ты пропатчил либу?
У меня своя либа и про bitseri я первый раз слышу. Просто знакомый код очень. И название говорящее.
фигасе, а бенчмарки делал?
На кой там бенчмарк. Там 50 строк кода. Основной бенчмарк - если делаешь fwrite вместо fstream.write, то в 4 раза быстрее. А если WriteFileEx, то вообще моментально :)
Обсуждают сегодня