は考える:C++:ポインタ型を指定すると、どのようにpointee型を回復できますか?
struct Field
{
template<class T> T Value() const
{
// ???
}
template<class S> S SimpleValue() const
{
return *reinterpret_cast<const S *>(GetVoidPointerToTheActualValue());
}
template<class P> const P *PointerValue() const
{
return reinterpret_cast<const P *>(GetVoidPointerToTheActualValue());
}
};
コンパイラが自動的にディスパッチするように私は、Field::Value<T>()
メソッドを実装するにはどうすればよいの:実際にはそうでないP*
Field::SimpleValue<S>
ある
Field::PointerValue<P>
T
場合さらにそれは保証ですそのT
は参照でもポインタへのポインタ型でもありません。ありがとうございました。
EDIT
@Grizzly - 私は、残念ながらそれは
Value<LPCWSTR>()
のコンパイル時に失敗し、あなたの提案を試してみました:1> playmssqlce.cpp 1>c:\dev\internal\playmssqlce\playmssqlce.cpp(75): error C2668: 'sqlserver::Field::Value' : ambiguous call to overloaded function 1> c:\dev\internal\playmssqlce\sqlserverfield.h(19): could be 'std::tr1::enable_if<_Test,_Type> sqlserver::Field::Value<LPCWSTR>(void) const' 1> with 1> [ 1> _Test=false, 1> _Type=LPCWSTR 1> ] 1> c:\dev\internal\playmssqlce\sqlserverfield.h(18): or 'std::tr1::enable_if<_Test,_Type> sqlserver::Field::Value<LPCWSTR>(void) const' 1> with 1> [ 1> _Test=true, 1> _Type=LPCWSTR 1> ] 1> while trying to match the argument list '(void)'
あなたのアドバイスが右に感じるので、それは、なぜ私には不明です。ところで、私は愚かなミスを修正した後のVisual Studio 2010
EDIT2
を使用しています、私はまだ問題を抱えています。だから、ここで私が持っているものです。
struct Field { template<class T> typename enable_if<is_pointer<T>::value, T>::type Value() const { return PointerValue(); } template<class T> typename enable_if<!is_pointer<T>::value, T>::type Value() const { return SimpleValue(); } template<class T> T SimpleValue() const { return *reinterpret_cast<const T *>(GetVoidPointerToTheActualValue()); } template<class T> const T *PointerValue() const { return reinterpret_cast<const T *>(GetVoidPointerToTheActualValue()); } };
私は
f.Value<const wchar_t *>()
をコンパイルしようとしているが、これを取得しています:私は今、間違っ1> playmssqlce.cpp 1>c:\dev\internal\playmssqlce\sqlserverfield.h(18): error C2783: 'const T *sqlserver::Field::PointerValue(void) const' : could not deduce template argument for 'T' 1> c:\dev\internal\playmssqlce\sqlserverfield.h(42) : see declaration of 'sqlserver::Field::PointerValue' 1> c:\dev\internal\playmssqlce\playmssqlce.cpp(75) : see reference to function template instantiation 'const wchar_t *sqlserver::Field::Value<const wchar_t*>(void) const' being compiled
何をしているのですか?
ありがとうございました。
EDIT3
愚かな私。グリズリーによる変更に気づいた:
template<class T> typename enable_if<is_pointer<T>::value, T>::type Value() const { return PointerValue<typename std::remove_pointer<T>::type>(); } template<class T> typename enable_if<!is_pointer<T>::value, T>::type Value() const { return SimpleValue<T>(); }
現在作業中です。
:あなたは '忘れなかった:: type'が' 'を<...>をenable_if後
ここでは、このソリューションの完全なコードはありますか? –
ええ、私はやったが、まだ問題がある - アップデートを参照してください。 – mark
@mark:さて、あなたは 'Value'関数をどのように呼びますか? – Xeo