gpt4 book ai didi

具有移动和复制构造函数的类中的 C++ 代码重复

转载 作者:太空宇宙 更新时间:2023-11-04 16:00:43 25 4
gpt4 key购买 nike

例如,一个类有两个构造函数,一个采用引用,另一个采用字符串右值引用。

class A {
public:

A(std::string&& str) {
Foo foo(std::move(str));
//do something with foo. (e.g., use it to initialize some members)
field = foo.bar();
}

A(const std::string& str) {
Foo foo(str);
//do something with foo. (e.g., use it to initialize some members)
field = foo.bar();
}

};

如果除了移动构造函数中出现的 std::move 之外,这两个构造函数几乎执行相同的操作,是否有任何方法可以避免出现两个几乎相同的代码块?

最佳答案

第一个选项是使用模板化构造函数:

class A
{
public:
template<typename T, typename = std::enable_if<std::is_same<std::remove_reference<T>::type, std::string>::value>::type>
A(T && str) {
Foo foo(std::forward<T>(str));
//do something
}
};

但是看起来有点丑。如果 Foo(const std::string &) 实际上复制了一个字符串,那么我更愿意按值传递参数:

class A
{
public:
A(std::string str) {
Foo foo(std::move(str));
//do something
}
};

这种方法的开销是额外的移动构造函数。但不要为此烦恼,因为编译器可能会对其进行优化。

关于具有移动和复制构造函数的类中的 C++ 代码重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45068480/

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