注: この質問で提供されている例は、製品コードではなく、まったく意味がありません。私の問題を説明するためにそこにあるだけです。
の可能性をテストしていましたdecltype
。特に、関数のパラメーターの型を推測するために使用されている場合は、問題が発生しました。
次のような構造の 2 つのクラスがあるとします。
struct ClassInt
{
// Note: no default ctor
ClassInt(int value)
: m_Value(value)
{}
int m_Value;
};
struct ClassDouble
{
// Note: no default ctor
ClassDouble(double value)
: m_Value(value)
{}
double m_Value;
};
m_Value
ここで、(何らかの方法で) 型パラメーター (上記のいずれか) のインスタンスを文字列で取得し、指定された値をそのメンバーに割り当てる関数を作成しました。
template< typename Ty >
Ty* get_fake_ptr() { return nullptr; }
// Retrieve pointer to Ty object by name and assign its value member.
// The problem is that we don't actually have an instance of Ty at the point
// where we want to define the type of the parameter "value".
template< typename Ty >
void assign(std::string name, decltype(get_fake_ptr<Ty>()->m_Value) value)
{
// Somehow get pointer to a Ty object by name
Ty* obj = ????;
// Assign
obj->m_Value = value;
}
現在、value
使用されるクラスは member の型が異なるため、パラメーターの型は型パラメーターに依存していますm_Value
。ご覧のとおり、を使用して解決しましたdecltype
。さて、通常、次decltype
のようにパラメーターで使用します。
template<typename Ty>
void assign(Ty& obj, decltype(obj.m_Value) value);
しかし、実際のインスタンスは関数本体で取得され、関数の引数が宣言された時点では使用できないため、ここでは明らかに不可能です。
get_fake_ptr
一致する型の を返すテンプレート関数を使用して一緒にハックしたnullptr
ので、コンパイラがメンバー型を決定するために使用できる「疑似インスタンス」があります。そしてそれは動作します:
さて、私が言ったように、これは私には本当にハックに思えます。そう:
この問題を解決するより良い方法はありますか?
ありがとうございました!