gpt4 book ai didi

c++ - 如何在未评估的上下文中获取应用于类成员的成员函数的结果类型

转载 作者:行者123 更新时间:2023-11-27 23:51:08 25 4
gpt4 key购买 nike

我什至不确定这个问题的标题是否正确。我想做的事情对我来说相当粗糙,所以我什至不知道如何以简洁的方式描述它。对此感到抱歉。

我有一个值容器,它被包装在某种“安全”值类中。我需要一个函数,它接受一个指向该容器的指针,一个对其成员的引用,然后发生以下情况:

如果传递的指针有效,则函数返回包装值内的值。

如果传递的指针是nullptr,函数返回一个默认构造的值。

Anyhoo,这里是一些代码。

template<typename T>
class Wrapped {
T t;
public:
T& operator*() {
return t;
}
};

class Container {
public:
Wrapped<int> i;
Wrapped<string> s;
};

// Compiler error with R.
// I'd like R to be the return type of invoking operator* on the member that's represented by M.
// I've tried about 50 different versions of declarations to declare the type of R. This one feels like it most closely represents what I'm trying to achieve.
// R should be the T in Wrapped<T>.

template <typename T, typename M, typename R = decltype(declval<M>().operator*())>
R value_or_default(T* object, M member, R default_value = R{})
{
object ? *((*object).*member) : default_value;
}

Container c;
auto actual_int = value_or_default(&c, &Container::i); // Returns *(c.i).
auto default_string = value_or_default(nullptr, &Container::s); // Returns string{}.

最佳答案

怎么样:

template<typename T>
class Wrapped {
T t{};
public:
T& operator*() {
return t;
}
};

class Container {
public:
Wrapped<int> i;
Wrapped<string> s;
};

template <typename T, typename R, typename C>
R value_or_default(T* object, Wrapped<R> C::* member)
{
return *((*object).*member);
}

template <typename R, typename C>
R value_or_default(nullptr_t, Wrapped<R> C::*, R default_value = R{})
{
return default_value;
}

int main() {
Container c;
auto actual_int = value_or_default(&c, &Container::i); // Returns *(c.i).
auto default_string = value_or_default(nullptr, &Container::s); // Returns string{}.

std::cout << actual_int << std::endl;
std::cout << default_string << std::endl;
return 0;
}

关于c++ - 如何在未评估的上下文中获取应用于类成员的成员函数的结果类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46352780/

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