注意:这个问题中提供的示例不是生产代码,没有任何意义。它只是为了说明我的问题。
我正在测试以下的可能性decltype
,特别是如果用它来推导函数参数类型,就会遇到问题:
假设有两个类结构如下:
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
member:
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
取决于类型参数,因为所使用的类的成员类型不同m_Value
。正如你所看到的,我通过使用解决了这个问题decltype
。现在,通常情况下,您会使用decltype
在参数上,如下所示:
template<typename Ty>
void assign(Ty& obj, decltype(obj.m_Value) value);
但这显然在这里是不可能的,因为实际实例是在函数体中检索的,因此在声明函数参数时不可用。
我使用模板函数将其组合在一起get_fake_ptr
它只返回一个nullptr
匹配类型,因此我有一个“伪实例”,编译器可以使用它来确定成员类型。它有效:
现在,正如我所说,这对我来说似乎真的很棘手。所以:
有没有更好的方法来解决这个问题?
谢谢你!