У меня есть шаблон класса (OutgoingPacket) с двумя различными функциями:функции разрешения и шаблон перегрузки
void _prepare() {
assert(false); // this should have been specialized and the native function never called.
}
template <typename Args, typename ... RemArgs>
void _prepare(Args&& args, RemArgs&& ... remArgs) {
assert(false); // this should have been specialized and the native function never called.
}
Я тогда определить некоторые специализации двух за пределами определения класса:
// no args
template <> void OutgoingPacket<PacketServerAck> ::_prepare();
template <> void OutgoingPacket<PacketSup> ::_prepare();
template <> void OutgoingPacket<PacketWelcome> ::_prepare();
template <> void OutgoingPacket<PacketServerPing>::_prepare();
// with args
template <> template <> void OutgoingPacket<PacketGTFO>::_prepare<std::string>(std::string&& message);
template <> template <> void OutgoingPacket<PacketPlayer>::_prepare<std::shared_ptr<User>>(std::shared_ptr<User>&& user);
Функция вызовы для подготовки без аргументов работают, как ожидалось, но вызовы перегрузки с аргументами вызывают базовый шаблон; они запускают утверждение.
Почему это происходит?
Обновление: Я просто попытался модифицировать определение специализации включить ссылку с тем же результатом:
template <> template <> void OutgoingPacket<PacketGTFO>::_prepare<std::string&&>(std::string&& message);
template <> template <> void OutgoingPacket<PacketPlayer>::_prepare<std::shared_ptr<User>&&>(std::shared_ptr<User>&& user);
На стороне записки, причину я делаю это таким образом, потому что я не чувствовал, что базовый класс OutgoingPacket должен быть усеян всеми этими различными версиями функции подготовки. И я не чувствовал, что подклассификация подходит, потому что различия между различными OutgoingPackets будут очень маленькими (~ 4 строки).
По существу, объект OutgoingPacket создается с произвольными параметрами, которые он затем передает функцию подготовки:
template<typename ... Args>
OutgoingPacket(Args&&... args) {
_prepare(std::forward<Args>(args)...);
}
Если это плохая практика, я мог получить некоторые советы по дизайну?
Кажется, что я не использовал rvalues. Я получаю ошибки времени компиляции, когда я пытаюсь, больше проблем для разработки, я полагаю. – vmrob