Как я могу инициализировать boost :: any со ссылкой на объект? - PullRequest
5 голосов
/ 15 января 2012

Я хочу сохранить ссылку на объект в boost::any объекте.Как мне инициализировать boost :: any object?Я пробовал std::ref(), но boost::any инициализируется с std::reference_wrapper<>.Например, следующие

#include <boost/any.hpp>
#include <cxxabi.h>
#include <iostream>

int main(void)
{
  int s;
  int i = 0;
  boost::any x(std::ref(i));
  std::cout << abi::__cxa_demangle(x.type().name(), 0, 0, &s) << "\n";
  return 0;
}

печатает

std::reference_wrapper<int>

Я хочу, чтобы boost::any содержал int& вместо.

Ответы [ 2 ]

3 голосов
/ 15 января 2012

Поведение правильное, ожидаемое и уместное. std::ref - это вспомогательная функция, которая создает объект типа std::reference_wrapper<T>, а оболочка-ссылка - это класс с семантикой значения, которая содержит ссылку - это именно то, что вы хотите поместить в контейнер, если вы хотите Контейнер для отслеживания внешних ссылок.

Так что просто следуйте вашему решению.

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

3 голосов
/ 15 января 2012

Класс boost::any не имеет интерфейса, позволяющего что-то вроде этого: вам нужно будет указать тип ссылки с помощью конструктора. Я не думаю, что вы можете явно указать тип шаблонного конструктора, потому что я не вижу места, где вы могли бы его вставить. Даже если вы можете явно указать параметр шаблона, он не будет работать в C ++ 2003, потому что нет доступной свертки ссылок, и параметр объявлен как принимающий T const&: вы пытаетесь создать T& const& который не будет летать Я думаю, что ваш лучший вариант - либо использовать std::reference_wrapper<T>, если вы настаиваете на чем-то похожем на удаленную ссылку, либо просто использовать T*.

Тем не менее, как правило, возможно иметь шаблонный метод статического фактора типа, подобного boost::any, который будет использоваться для явного указания аргумента шаблона. Однако, поскольку boost::any специально предназначен для работы с типами значений , это не сделано. Я немного сомневаюсь, нужно ли это делать также: использование указателя - отличная альтернатива. Если вам действительно нужен ссылочный тип, вам, вероятно, придется реализовать его самостоятельно.

...