Я работаю над созданием функции для класса, и параметр объявлен как void*, однако внутри функции мне нужно проверить, является ли этот void* либо shared_ptr, либо unique_ptr. Есть ли способ проверить этот тип ситуации?
Это то, с чем я работаю до сих пор; мой класс является типом шаблона и не хранит никаких переменных-членов. У него есть конструктор по умолчанию, и его также можно построить, передав shared_ptr<Type>
или unique_ptr<Type>
, и он имеет несколько функций allocate()
, где они выполняют один и тот же тип работы.
#ifndef ALLOCATOR_H
#define ALLOCATOR_H
#include <memory>
#include <iostream>
template<class Type>
class Allocator {
public:
Allocator(){}
Allocator( Type type, void* pPtr );
Allocator( std::shared_ptr<Type>& pType );
Allocator( std::unique_ptr<Type>& pType );
// ~Allocator(); // Default Okay
void allocate( std::shared_ptr<Type>& pType );
void allocate( std::unique_ptr<Type>& pType );
void allocate( Type type, void* pPtr );
private:
Allocator( const Allocator& c ); // Not Implemented
Allocator& operator=( const Allocator& c ); // Not Implemented
}; // Allocator
#include "Allocator.inl"
#endif // ALLOCATOR_H
В моем файле *.cpp
есть только #include "Allocator.h"
, так как все реализации находятся в моем файле *.inl
.
Мои два конструктора: Allocator( std::shared_ptr<Type>& pType );
и Allocator( std::unique_ptr<Type>& pType );
вместе с обеими соответствующими функциями allocate()
работают нормально. У меня проблемы с конструктором Allocator( Type type, void* pPtr );
и его функцией сопоставления.
Сам конструктор прост, поскольку все, что он делает, это вызывает функцию сопоставления, передавая ей переменные.
template<class Type>
Allocator<Type>::Allocator( Type type, void* pPtr ) {
allocate( type, eType, pPtr );
}
Именно в реализации функции я борюсь.
template<class Type>
void Allocator<Type>::allocate( Type type, void* pData ) {
if ( pData == reinterpret_cast<void*>( std::shared_ptr<Type ) ) {
std::shared_ptr<Type> pShared;
pShared.reset( new Type( type ) );
pData = reinterpret_cast<void*>( pShared );
} else if ( pData == reinterpret_cast<void*>( std::unique_ptr<Type ) ) {
std::unique_ptr<Type> pUnique;
pUnique.reset( new Type( type ) );
pData = reinterpret_cast<void*>( pUnique );
} else {
std::cout << "Error invalid pointer type passed in << std::endl
<< "must be either a std::shared_ptr<Type> << std::endl
<< "or a std::unique_ptr<Type> << std::endl;
}
}
Помимо проверки того, является ли переданный void*
std::shared_ptr<Type>
или std::unique_ptr<Type>
, другие вопросы, которые у меня могут возникнуть, заключаются в том, является ли мое использование reinterpret_cast<void*>
правильным способом преобразования интеллектуального указателя в пустой указатель, и если нет, то как этого можно достичь ?
reinterpret_cast
, где вы точно знаете, как интерпретировать расположение памяти, на которое указывает указательvoid*
. - person πάντα ῥεῖ   schedule 08.10.2015void*
указывает на общий/уникальный PTR? Или это указывает на то, на что указывает общий/уникальный ptr? Или вы действительно пытаетесь интерпретировать байты общего/уникального указателя какvoid*
? Если третья возможность (как следует из вашего другого кода), то я думаю, что вы обречены. Среди других проблем нет гарантии, что размер указателя void будет таким же, как размер общего/уникального указателя (и я полагаю, что shared_ptr, вероятно, никогда не будет того же размера). - person TheUndeadFish   schedule 08.10.2015void*
вообще должна беспокоиться о них. Вы пытаетесь сжать реализацииallocate
в одну функцию (согласно ответу Реми)? Если это так, то кажется, что это слишком усложняет то, что должно быть парой простых отдельных перегрузок. В противном случае вы вызываете класс способом, который уже не обрабатываются текущими перегрузкамиstd::shared_ptr<Type>&
иstd::unique_ptr<Type>&
? Если да, то покажите снаружи, чего вы действительно пытаетесь достичь. - person TheUndeadFish   schedule 08.10.2015