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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Последовательный ввод двух строк http://www.cyberforum.ru/cpp-beginners/thread646415.html
мне нужно ввести две строки одна за другой,но у меня сразу предлагается ввод двух строк string name,for_number; vector<int> number; 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; ? В первом случае это...
C++ Реализация управления из командной строки
Всем приветики-чмок. Есть пара вопросов: 1. Как правильно реализовать управление типа "gccp file show f.cpp" (название_программы команда подкоманда1 адрес_объекта)? Может, как массив указателей на...
C++ Виртуальная машина http://www.cyberforum.ru/cpp-beginners/thread646361.html
Просто задание на практику. В ходе разбора самого задания возникают некоторые вопросы, помогите пожалуйста разобраться. Само задание всё как написано в варианте: PSW - 32 бита = 16+16 = IP +...
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... подробнее

Показать сообщение отдельно
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 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 чаще всего будут заменены сразу же на её значение.

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


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