Здравствуйте, Marty, Вы писали:
M>А SFINAE был уже в C++03, но я тогда не прочувствовал его в полной мере, сам тогда такого кода почти не писал, только использовал, часто не понимая, как оно работает, да и хелперов из C++11 — C++17 не было, сейчас хочу прочувствовать всё это полной ложкой
Ты просто возьми себе на заметку, что концепты имеют существенные преимущества перед SFINAE. Одним из главных преимуществ я бы назвал
Partial ordering. При использовании SFINAE все перегрузки равноправны и необходимо обеспечить, чтоб все фильтры были взаимоисключающими во избежание конфликтов. При большом количестве перегрузок в таких областях как ввод-вывод, сериализация, форматирование и т.п. это иногда превращается в нехилый геморрой. Использование концептов же позволяет делать одни перегрузки более специальными, чем другие. Это очень похоже на то, как если бы мы писали перегрузки для базового и производного классов.
Здравствуйте, rg45, Вы писали:
R>Ты просто возьми себе на заметку, что концепты имеют существенные преимущества перед SFINAE. Одним из главных преимуществ я бы назвал Partial ordering. При использовании SFINAE все перегрузки равноправны и необходимо обеспечить, чтоб все фильтры были взаимоисключающими во избежание конфликтов. При большом количестве перегрузок в таких областях как ввод-вывод, сериализация, форматирование и т.п. это иногда превращается в нехилый геморрой. Использование концептов же позволяет делать одни перегрузки более специальными, чем другие. Это очень похоже на то, как если бы мы писали перегрузки для базового и производного классов.
Да, спасибо, принял, буду иметь в виду. Но я пока на C++17, таки.
У меня есть проекты, которые должны, по моим представлениям, запускаться и на W2K, или хотя бы WinXP. А последняя MSVS — 2019, которая умеет в WinXP — умеет только в C++17
Ну и откушать SFINAE полной ложкой... Мои загоны...
Здравствуйте, kov_serg, Вы писали:
_>вот что харектерно, c++ всё есть для того чтобы иметь bigint но std::bigint нет.
_>Зато еще есть куча всяких целых спец типов __m128i __m256i __m512i 
Когда решат
как это сделать, тогда видимо и появится.
Здравствуйте, _NN_, Вы писали:
_>>вот что харектерно, c++ всё есть для того чтобы иметь bigint но std::bigint нет.
_>>Зато еще есть куча всяких целых спец типов __m128i __m256i __m512i
_NN>Когда решат как это сделать, тогда видимо и появится.
Давно надо было это сделать. Чего тянут не понятно.
а то с++ как правило делает так:
#include <iostream>
#include <boost/multiprecision/cpp_int.hpp>
using namespace boost::multiprecision;
int main() {
cpp_int u=1;
for(unsigned i=2;i<=100;i++) u*=i;
std::cout<<u<<std::endl;
return 0;
}
| результат для 100! |
| In file included from example.cpp:2:
/usr/include/boost/multiprecision/cpp_int.hpp: In instantiation of ‘struct boost::multiprecision::backends::cpp_int_base<0, 4294967295, boost::multiprecision::signed_magnitude, boost::multiprecision::unchecked, std::allocator<long long unsigned int>, false>’:
/usr/include/boost/multiprecision/cpp_int.hpp:1033:8: required from ‘struct boost::multiprecision::backends::cpp_int_backend<>’
1033 | struct cpp_int_backend
| ^~~~~~~~~~~~~~~
/usr/include/boost/multiprecision/number.hpp:1671:12: required from ‘class boost::multiprecision::number<boost::multiprecision::backends::cpp_int_backend<> >’
1671 | Backend m_backend;
| ^~~~~~~~~
example:6:12: required from here
6 | cpp_int u=1;
| ^
/usr/include/boost/multiprecision/cpp_int.hpp:172:8: error: no class template named ‘rebind’ in ‘class std::allocator<long long unsigned int>’
172 | struct cpp_int_base<MinBits, MaxBits, signed_magnitude, Checked, Allocator, false> : private Allocator::template rebind<limb_type>::other
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/include/boost/multiprecision/cpp_int.hpp:174:66: error: no class template named ‘rebind’ in ‘class std::allocator<long long unsigned int>’
174 | typedef typename Allocator::template rebind<limb_type>::other allocator_type;
| ^~~~~~~~~~~~~~
|
| |
Здравствуйте, kov_serg, Вы писали:
_>Можно еще вот так извернуться если не нравиться разные но одинаковые типы
_>https://godbolt.org/z/4ocTWszE5
template<class T> struct Info {
enum {
size=sizeof(T),
has_sign=(T)-1<0,
is_2complement=(1&(T)-1),
code=size*4+has_sign*2+is_2complement
};
};
template<int n>void fnc(const void* t) {
printf("fn<code=%d> size=%d sign=%d two_comliment=%d\n",n,n/4,(n>>1)&1,n&1);
}
template<class T>void fn(const T &t) { fnc<Info<T>::code>(&t); }
У тебя пробелы платные, что ли?