Форум программистов, компьютерный форум CyberForum.ru

Встраивание результата функции в место ее вызова - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Последовательный ввод двух строк http://www.cyberforum.ru/cpp-beginners/thread646415.html
мне нужно ввести две строки одна за другой,но у меня сразу предлагается ввод двух строк string name,for_number; vector<int> number; cout << "введите ФИО абонента" << endl; getline(cin,name); cout << "Введите номер абонента" << endl;
C++ Абстрактные классы Помогите плиз, экзаменационное задание, а разобраться не могу с ним: Создать консольное приложение, в котором реализовать работу склада. На складе есть отделы: * Бытовая техника. * Офисные товары. * Стройматериалы. Реализовать абстрактный класс товар. Затем для каждого отдела реализовать класс, который будить унаследован от базового класса товар. В классе товар должны быть методы и... http://www.cyberforum.ru/cpp-beginners/thread646409.html
C++ перегрузка операторов
Товарисссчи, что значит запись: CVector2D::operator+(CVector2D const& v1)const файл *срр и чем отличается от CVector2D const operator +(CVector2D const& vector2)const; ? В первом случае это уже непосредственно инициализация? А второй случай описание функциии в классе?(перегружаем оператор operator+ и вызываем его как метод ?(1й код) Добавлено через 6 минут и если можно написать...
C++ Реализация управления из командной строки
Всем приветики-чмок. Есть пара вопросов: 1. Как правильно реализовать управление типа "gccp file show f.cpp" (название_программы команда подкоманда1 адрес_объекта)? Может, как массив указателей на функции? Или деревья какие-нибудь? То есть, не _лишь_бы_работало_,а как лучше сделать по уму. 2. Допустим, я делаю в терминале: cd C:\pr\cpp. Как Windows (да или где угодно, если есть...
C++ Виртуальная машина http://www.cyberforum.ru/cpp-beginners/thread646361.html
Просто задание на практику. В ходе разбора самого задания возникают некоторые вопросы, помогите пожалуйста разобраться. Само задание всё как написано в варианте: PSW - 32 бита = 16+16 = IP + Flags Память - слова по 48 бит, размер адреса = 16 бит сумматор - 48 бит адресный регистр - 16 бит ТИпы данных:
C++ Подключении механизма обнаружение утечек памяти // output N number of M devide L.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "iostream" #include <conio.h> #include <iomanip> int _tmain(int argc, _TCHAR* argv) { подробнее

Показать сообщение отдельно
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
04.09.2012, 01:16     Встраивание результата функции в место ее вызова
Сразу напомнию: надеюсь, вы понимаете, что если в функцию передаётся не константа, то это невыполнимо в принципе.

Надёжный способ для Си++ есть только один: шаблонная магия. Это позволит рассчитать нужное значение при компиляции и подставить его в нужное место. Но выглядит она не особо ахти даже для такого простого случая: Func<n> = 0 для чётных и 1 для нечётных чисел.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
 
template <int N>
struct Func {
  const static int value = N % 2 ? 1 : 0;
  // но это ещё просто, так как всё влазит в одно полное выражение
  // если надо что-то сложнее, то только рекурсией на шаблонах
};
 
int main()
{
  std::cout << Func<1>::value << " "
            << Func<2>::value << " "
            << Func<3>::value << " "
            << Func<4>::value;
}
Шаблоны раскрываются при компиляции, так что значение точно вычисляется при компиляции. Подставляется прямиком оно не гарантированно, но наверняка (читайте дальше).

Чем сложнее функция, тем больше придётся писать этой магии. Но чисто принципиально можно так вычислить любую функцию. Вот только запись будет сложной.


Ненадёжный способ: компиляторы обычно выполняют свёртку констант и если им удаётся что-то вычислить сразу же, они это сделают и подставят. То же самое с константами:
const int n = 10;
Все обращения к n чаще всего будут заменены сразу же на её значение.

Но заставить компилятор делать это нельзя. Можно только подсказать и попросить, но решать, выполнять или нет подстановку, он будет сам. Вон тот ваш вызов можно вычислить при компиляции, но не факт, что компилятор это увидит и сделает.


В Си++ нет нормальной макросистемы, чтобы удобно делать вот такие гарантированные раскрытия кода при компиляции. Есть только шаблоны.
 
Текущее время: 13:28. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru