私は、オブジェクトの派生型をチェックするために型IDを使用します。比較型IDポインタ
#include <cstdint>
#include <memory>
#include <cassert>
#include <string>
#include <typeinfo>
struct Wrap
{
explicit Wrap(int64_t id) : mImpl(new Impl<int64_t>(id)) {}
explicit Wrap(std::string id) : mImpl(new Impl<std::string>(std::move(id))) {}
bool isInt64() const
{
const ImplBase& impl = *mImpl;
return (&typeid(impl) == &typeid(const Impl<int64_t>));
}
bool isString() const
{
const ImplBase& impl = *mImpl;
return &typeid(impl) == &typeid(const Impl<std::string>);
}
private:
struct ImplBase
{
virtual ~ImplBase() {}
};
template<typename T>
struct Impl : ImplBase
{
Impl(T value) :
mValue(std::move(value))
{
}
T mValue;
};
std::shared_ptr<const ImplBase> mImpl;
};
int main()
{
Wrap r1(int64_t(1));
assert(r1.isInt64());
Wrap r2(std::string("s"));
assert(r2.isString());
}
動作しているようですが、しかし、私は、これはすべてのプラットフォームで動作しない可能性があることを心配します。また、私は、私が使用する必要があるかはわからない:
比較機能でtypeid(const Impl<std::string>&) // with ref
代わりの
typeid(const Impl<std::string>) // without ref
。
上記のコードは正しいですか?そうでない場合は、どうすれば修正できますか?
VTのtypeidフィールドに参照型が格納されるのはなぜですか? – Arunmu
@Arunmu良い点は、私はそれを考慮していなかった。 – StackedCrooked