boost::any копирует значение?

190
25 марта 2018, 21:42

Почему не совпадает указатель на объект, если сначала его превратит в any, а потом обратно в тот-же тип?

Пример:

#include <iostream>
#include <boost/any.hpp>
int main() {
        int i = 1;
        int* p = &i;
        boost::any a = i;
        int i2 = boost::any_cast<int>(a);
        int* p2 = &i2;
        std::cout << p << " == " << p2 << std::endl;
        std::cout << i << std::endl;
        *p = 2;
        std::cout << i << std::endl;
        *p2 = 3;
        std::cout << i << std::endl;
}

Вывод:

[root@localhost Test]# make
=============================================
touch test
rm test
ccache -c
Cleaned cache
ccache g++ -c -Wall test.cpp -o test.o
ccache g++  test.o -o test
rm -r test.o
./test
0xbeb49740 == 0xbeb49748
1
2
2

Как можно этого избежать? Использовать как any сам указатель?

Answer 1

При чем тут any?

Вот по сути ваш код:

    int i = ...;
    int* p = &i;
    int i2 = ...;
    int* p2 = &i2;
    std::cout << p << " == " << p2 << std::endl;

У вас две разные переменные, которые, конечно же, находятся в памяти в разных местах - так что их адреса, понятно, разные.

READ ALSO
Перевод выражения в код ассемблера

Перевод выражения в код ассемблера

Есть программа который переводит выражение в обратную польскую запись и потом вычисляет результатмне нужно в момент вычисления транслировать...

198
Открытие файла без расширения в С++

Открытие файла без расширения в С++

Есть файл, путь - C:\Windows\System32\config\SYSTEM "SYSTEM" - сам файл, лог, в С++ пишу такой код, но файл невозможно открыть:

177
Вызов функции через адрес поля класса

Вызов функции через адрес поля класса

Могу ли я определить указатель на функцию как поле в классе, записать в нее адрес функции (зная сигнатуру метода) и обращаться к данному полю...

180
C++ Серебряная матрица [N][N]

C++ Серебряная матрица [N][N]

Подскажите, в чем моя ошибка? Ни разу не засчитало ответ

344