Специализация шаблона, использование другого шаблона

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

Проблема в том, что специализация шаблона не работает.

Например.:

#include <iostream>
#include <swift.hpp>
#include <swift/event.hpp>
#include <swift/event/primitives.tpl>

using namespace swift;

template<class T> void print(const T& value)
{
std::cout << event::representate(value) << std::endl;
}

int main()
{
Int32 x = 23;
print(x);
}

Проблема в том, что «~» будет напечатано. Таким образом, в этом примере event :: представитель () указывает на функцию, определенную в «swift / event.hpp», а не на специализированную функцию, определенную в «swift / event / primitives.hpp».

Хорошо, это на самом деле не проблема, потому что ее легко решить, изменив функцию представления в swift / event.hpp на тело функции специализированного представления.

Но я не могу этого сделать по следующим причинам:

  1. Он не будет работать с пользовательскими классами, если нет оператора std :: stream << определенный для пользовательского класса (хотя для свободных функций это может быть возможно).
  2. Специализация требует не только функция event :: представитель. Но также event :: serialize и event :: deserialize.

Хорошо смотрит на пункт 2; Класс OStream использует event :: serialize и event :: deserialize в шаблонной функции-члене. Но специализация event :: serialize и event :: deserialize должен быть способен использовать методы OStream (шаблон).

Ну, я застрял в этой точке. Я надеюсь, что кто-то может указать мне правильное направление!

Источник

swift.hpp:

#ifndef HG_swift
#define HG_swift

// C++ Includes
#include <boost/cstdint.hpp>
#include <string>

namespace swift
{
// Cross-platform primairy types:
typedef void Void;
typedef bool Bool;
typedef Bool Bit;
typedef char Char;
typedef unsigned char UChar;
typedef uint8_t Byte;
typedef int16_t Int16;
typedef uint16_t UInt16;
typedef int32_t Int32;
typedef uint32_t UInt32;
typedef Int16 Short;
typedef UInt16 UShort;
typedef Int32 Int;
typedef UInt32 UInt;
typedef double Double;
typedef float Float;
typedef std::string String;
}

#endif //HG_swift

скор / event.hpp

#ifndef swift_event
#define swift_event

#include <iostream>
#include <sstream>
#include <exception>

#include <swift/String.hpp>

namespace swift
{
class OStream;
class IStream;

namespace event
{
template<class T> String representate(T& value)
{
return "~";
}

template<class T> void serialize(T& value, OStream& stream) { }
template<class T> void deserialize(T& value, IStream& stream) { }
}
}

#endif //swift_event

скор / OStream.hpp:

#ifndef HG_swift_OStream
#define HG_swift_OStream

// Imports:
#include "swift.hpp"
// C++ includes:
#include <iostream>
#include <boost/archive/binary_oarchive.hpp>

namespace swift
{
struct OStream
{
boost::archive::binary_oarchive archive;

OStream(std::ostream& os) : archive(os, boost::archive::no_header) {}

template<class T> void write(T value)
{
event::serialize(value, *this);
}
};
}

#endif //HG_swift_io_OStream

скор / событие / primitives.tpl:

#include <swift.hpp>
#include <swift/event.hpp>
//#include <swift/IStream.hpp>
#include <swift/OStream.hpp>
#include <iostream>
#include <sstream>

namespace swift
{
// Events
namespace event
{
// Events for primary types:
// Int32
template<> String representate<Int32>(Int32& value)
{
std::stringstream str;
str << value;
return str.str();
}

template<> void serialize<Int32>(Int32& value, OStream& stream)
{
stream.archive & value;
}

template<> void deserialize<Int32>(Int32& value, IStream& stream)
{
stream.archive & value;
}
}
}

0

Решение

Проблема в том, что const Int32& не может быть преобразован в Int32&, Таким образом, специализация не может быть сопоставлена. Изменение swift/event/primitives.tpl использовать это вместо будет работать:

    template<> String representate<const Int32>(const Int32& value)
{

или вы можете изменить основной шаблон, чтобы взять const T& вместо T&,

С функциями лучше перегружать, чем специализировать (см. Специализация шаблона VS Перегрузка функций):

    String representate(Int32 value)
{
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]