Вопросы с тегом «c++»

53
Как получить адрес лямбда-функции C ++ внутри самой лямбды?

Я пытаюсь выяснить, как получить адрес лямбда-функции внутри себя. Вот пример кода: []() { std::cout << "Address of this lambda function is => " << ???? }(); Я знаю, что могу перехватить лямбду в переменной и напечатать адрес, но я хочу сделать это на месте, когда эта анонимная...

51
Оператор равенства не определен для пользовательской реализации оператора космического корабля в C ++ 20

Я столкнулся со странным поведением с новым оператором космического корабля <=>в C ++ 20. Я использую компилятор Visual Studio 2019 с /std:c++latest. Этот код компилируется нормально, как и ожидалось: #include <compare> struct X { int Dummy = 0; auto operator<=>(const X&)...

50
Инициализируйте несколько постоянных членов класса, используя один вызов функции C ++

Если у меня есть две разные постоянные переменные-члены, которые нужно инициализировать на основе одного и того же вызова функции, есть ли способ сделать это, не вызывая функцию дважды? Например, класс дроби, где числитель и знаменатель постоянны. int gcd(int a, int b); // Greatest Common Divisor...

48
Шаблон дружественной строки к числовому в C ++

В стандартной библиотеке C ++ есть функции для преобразования из строковых в числовые типы: stoi stol stoll stoul stoull stof stod stold но я считаю утомительным использовать их в шаблоне кода. Почему нет шаблонных функций что-то вроде: template<typename T> T sto(...) преобразовать строки в...

47
Почему «использование системы»; не считается плохой практикой?

У меня есть опыт работы с C ++, и я полностью понимаю и согласен с ответами на этот вопрос: почему «используется пространство имен std;» считается плохой практикой? Поэтому я удивлен тем, что, имея некоторый опыт работы с C # сейчас, я вижу здесь совершенно противоположное: using...

46
std :: vector (ab) использует автоматическое хранение

Рассмотрим следующий фрагмент: #include <array> int main() { using huge_type = std::array<char, 20*1024*1024>; huge_type t; } Очевидно, что это приведет к сбою на большинстве платформ, поскольку размер стека по умолчанию обычно составляет менее 20 МБ. Теперь рассмотрим следующий код:...

46
Алгоритм нахождения решения для A xor X = B + X

По заданным целым числам A и B найдите целое число X так, чтобы: A, B <2 * 1e18 A xor X = B + X Я очень сомневаюсь, что это уравнение можно решить с помощью математики. Это проблема кодирования, с которой я столкнулся 3 года назад, и даже сейчас я не могу решить ее самостоятельно. Мой код до...

45
Как я могу получить глубину многомерного std :: vector во время компиляции?

У меня есть функция, которая принимает многомерный std::vectorи требует, чтобы глубина (или количество измерений) передавалась как параметр шаблона. Вместо жесткого кодирования этого значения я хотел бы написать constexprфункцию, которая будет принимать std::vectorи возвращать глубину как unsigned...

44
Почему оператор! = Удален в C ++ 20 для многих стандартных типов библиотек?

Согласно cppreference , std::type_info::operator!=удаляется с C ++ 20, однако, по- std::type_info::operator==видимому, остается. В чем причина? Я мог бы согласиться с тем, что сравнивать неравенство бессмысленно, но тогда сравнивать равенство было бы так же бессмысленно, не так ли? Точно так же...

43
Можно ли предотвратить пропуск элементов инициализации агрегата?

У меня есть структура со многими членами одного типа, как это struct VariablePointers { VariablePtr active; VariablePtr wasactive; VariablePtr filename; }; Проблема в том, что если я забуду инициализировать один из членов структуры (например wasactive), например: VariablePointers{activePtr,...

41
Идиоматический способ различения двух нулевых конструкторов

У меня есть такой класс: struct event_counts { uint64_t counts[MAX_COUNTERS]; event_counts() : counts{} {} // more stuff }; Обычно я хочу по умолчанию (ноль) инициализировать countsмассив, как показано. Однако в выбранных местах, определенных профилированием, я хотел бы подавить инициализацию...

40
Подходы к функции SFINAE в C ++

Я активно использую функцию SFINAE в проекте и не уверен, есть ли какие-либо различия между следующими двумя подходами (кроме стиля): #include <cstdlib> #include <type_traits> #include <iostream> template <class T, class = std::enable_if_t<std::is_same_v<T,...

39
Почему переключатель не оптимизирован так же, как цепочка, если еще в c / c ++?

Следующая реализация square производит серию операторов cmp / je, как я и ожидал от цепочки if: int square(int num) { if (num == 0){ return 0; } else if (num == 1){ return 1; } else if (num == 2){ return 4; } else if (num == 3){ return 9; } else if (num == 4){ return 16; } else if (num == 5){...

38
Почему remove_reference не работает с функциями?

Сталкивался с чем-то странным, когда делал шаблонное метапрограммирование на днях. Это в основном сводится к тому, что утверждение не (как я и ожидал) не прошло. static_assert(std::is_same_v<void(), std::remove_reference_t<void()&>>); Сначала я думал, что допустил синтаксическую...

38
Шаблон метапрограммирования

Может кто-нибудь объяснить мне, почему первый способ метапрограммирования шаблона идет в бесконечный цикл, а второй работает правильно. #include <iostream> using namespace std; template<int N, int M> struct commondivs { static const int val = (N<M) ? commondivs<N,(M-N)>::val :...

35
Как сравнить сигнатуру двух функций?

Есть ли способ проверить, имеют ли две функции одинаковую подпись? Например: int funA (int a, int b); int funB (int a, int b); float funC (int a, int b); int funD (float a, int b); В этом примере funAи funBесть единственная комбинация функций, которую следует вернуть...

34
Инкремент указателя на динамический массив размером 0 не определен?

AFAIK, хотя мы не можем создать массив статической памяти размером 0, но мы можем сделать это с динамическими: int a[0]{}; // Compile-time error int* p = new int[0]; // Is well-defined Как я читал, pдействует как элемент «один конец». Я могу напечатать адрес, на который pуказывает. if(p) cout...

34
Перегрузка функции с помощью шаблонов

Я пытаюсь определить функцию, используя шаблоны, и я хочу, чтобы typename было либо int, либо anEnum (конкретное перечисление, которое я определил). Я пробовал следующее, но мне не удалось: template <int | anEnum T> // or <int T, anEnum T> or <int, anEnum T> bool isFunction(const...

34
Как инициализировать вектор пар C ++ 17 с необязательным элементом

В C ++ 17, как вы объявляете и инициализируете вектор пар (или кортежей) с необязательным элементом? std::vector<std::pair<int, optional<bool> > > vec1 = { {1, true}, {2, false}, {3, nullptr}}; У меня есть пара, где второй элемент может быть нулевым /...