gpt4 book ai didi

c++ - 使用 decltype 的函数参数类型

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:14:19 27 4
gpt4 key购买 nike

注意:这个问题中提供的示例不是生产代码,完全没有意义。它只是为了说明我的问题。

我在测试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 成员:

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 所以我有一个编译器可以用来确定的“伪实例”成员类型。它有效:

working

现在,正如我所说,这对我来说真的很老套。所以:

有没有更好的办法解决这个问题?

谢谢!

最佳答案

您可以使用 decltype(std::declval<T>().m_Value)推断出 T 的类型的 m_Value成员(member)而不是使用您的 get_fake_ptr()功能。他们最终实现了相似的目标。

顺便说一句,你的get_fake_ptr()函数不需要定义。您可以简单地将其保留为 template <typename T> T* get_fake_ptr();你仍然可以在里面使用它 decltype .

关于c++ - 使用 decltype 的函数参数类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32686638/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com