gpt4 book ai didi

c++ - 接受对类模板参数的左值和右值引用

转载 作者:行者123 更新时间:2023-12-01 14:53:05 25 4
gpt4 key购买 nike

我有以下类(class):

template<typename T>
class Foo {
// ...
void frobnicate(const T& arg) {
// [lots of code here]
do_the_thing(arg);
// [lots of code here]
}

void frobnicate(T&& arg) {
// [lots of code here, same as above]
do_the_thing(std::move(arg));
// [lots of code here, same as above]
}
}

有没有一种方法可以消除两个 frobnicate版本之间的重复代码,而无需引入“post”和“pre”帮助函数?

理想情况下,我想写一些类似的东西:

   void frobnicate(/*what goes here?*/ arg) {
// [lots of code here]
if (is_rvalue_reference(arg))
do_the_thing(std::move(arg));
else
do_the_thing(arg);
// [lots of code here]
}

有没有办法做到这一点?

我认为,如果 T不是类模板参数而是函数模板参数,我可能可以以某种巧妙的方式使用模板参数推演(尽管我不确定我到底该怎么做),但要涉及到类我不确定从哪里开始...

最佳答案

我认为最好的方法是制作函数模板并利用forwarding reference,它可以保留参数的值类别。

template<typename T>
class Foo {
template <typename X>
void frobnicate(X&& arg) {
// [lots of code here]
do_the_thing(std::forward<X>(arg));
// [lots of code here]
}
};

如果您想将 frobnicate接受的类型限制为 T,则可以将 static_assertstd::enable_if应用于 frobnicate,例如
template<typename T>
class Foo {
template <typename X>
void frobnicate(X&& arg) {
static_assert(std::is_same_v<T, std::decay_t<X>>, "X must be the same type of T");
// [lots of code here]
do_the_thing(std::forward<X>(arg));
// [lots of code here]
}
};

要么
template<typename T>
class Foo {
template <typename X>
std::enable_if_t<std::is_same_v<T, std::decay_t<X>>> frobnicate(X&& arg) {
// [lots of code here]
do_the_thing(std::forward<X>(arg));
// [lots of code here]
}
};

关于c++ - 接受对类模板参数的左值和右值引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61043593/

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