Скрыть реализацию typedef - PullRequest
       1

Скрыть реализацию typedef

1 голос
/ 08 декабря 2011

У меня есть typedef , который зависит от типа в другой библиотеке (в данном случае повышение):

#include <boost/any.hpp>

typedef boost::any& myAnyType;

Я бы использовал определение myAnyType во всех моих программах, скрывая его реальную природу и сохраняя независимость от библиотеки Boost (клиенту не нужно устанавливать Boost для использования myAnyType)

Это возможно?

Ответы [ 3 ]

2 голосов
/ 08 декабря 2011

клиенту не нужно устанавливать Boost для использования myAnyType

Это, безусловно, делает.Да, вы определяете это как ссылку на any, чтобы они могли объявить переменную "myAnyType" без определения типа.Но они ничего не могут с этим поделать.Действительно, что-то столь простое, как myAnyType var;, терпит неудачу, потому что это ссылка.

Они даже не могут вызывать функции, которые принимают myAnyType в качестве параметра, потому что они не могут объявить объект myAnyType.Даже const myAnyType не будет работать, потому что C ++ должен будет создать временный.И он не может создать временный объект из неопределенного типа.

Ваша библиотека не зависит от Boost; полагается на Boost и добавляет Boost в свой интерфейс.myAnyType является частью Boost, потому что он основан на чем-то, что является частью Boost.Таким образом, ваши клиенты являются клиентами Boost.Чем раньше вы и они это примут, тем лучше.

0 голосов
/ 08 декабря 2011

если это просто определение типа, вы можете получить, используя предварительное объявление , если физическая зависимость нулевая . для иллюстрации:

namespace MON {
class t_hidden_type; // << the forward
typedef t_hidden_type& t_opaque_type_ref; // << the typedef
}

таким образом, включение не требуется.

Конечно, вы также можете обернуть скрытый тип, если вам действительно нужно скрыть реализацию - это также переименует двоичные символы.

namespace MON {
class myAnyType; // in the public interface
}

namespace MON {
namespace Private {
// in the private/package interface
class myAnyType {
  ...
  boost::any d_any;
};
}
}
0 голосов
/ 08 декабря 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...