Скрытие реализации указателя в заголовочном файле - PullRequest
0 голосов
/ 23 апреля 2020

Я использую библиотеку - nlohmann / json и хочу иметь член, который указывает на json для внутреннего использования.

Я бы хотел не использовать всю библиотеку как зависимость от времени компиляции, поэтому я подумал об использовании указателя на объявленную вперед структуру

в заголовке

struct my_json; // forward declare 

std::unique_ptr<my_json> memberJson;

в cpp:

struct my_json : public nlohmann::json {};

Но проблема в том, что когда я пытаюсь использовать его внутри класса, я получаю либо

error C2440: '=': cannot convert from 'nlohmann::json *' to 'my_json *'

При попытке назначить адрес результата reference operator[](const typename object_t::key_type& key) обратно my_json *

или

error C2440: 'initializing': cannot convert from 'nlohmann::basic_json<std::map,std::vector,std::string,bool,int64_t,uint64_t,double,std::allocator,nlohmann::adl_serializer>' to 'my_json  &'

при попытке присвоить результат reference operator[](const typename object_t::key_type& key) my_json & напрямую

Есть ли элегантный решение этого? (Если я хочу избежать reinterpret_cast указателей) Безопасен ли static_cast в этом сценарии?

1 Ответ

3 голосов
/ 23 апреля 2020

Почему бы вам не переслать декларацию nlohmann::json?

namespace nlohmann { class json; }

Редактировать: я использовал json_fwd.hpp. (https://github.com/nlohmann/json/blob/master/include/nlohmann/json_fwd.hpp)

Заголовок :

#pragma once
#include "json_fwd.hpp"
#include <memory>

class A {
    std::unique_ptr<nlohmann::json> ptr;

    public:
        A();
        ~A();
};

Реализация:

#include "Header.h"
#include "json.hpp"

A::A() :
    ptr(std::make_unique<nlohmann::json>()) {

    (*ptr)["Hallo"] = 2;
}

A::~A() = default;
...