gpt4 book ai didi

c++ - 如何结合就地转换和复制转换?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:06:40 24 4
gpt4 key购买 nike

我想将这两个功能合并到一个函数接口(interface)中:

T& Transform(T & foo){
//transform t
return t;
}

T As_Transformed(T foo){
//transform t
return t;
}

有时我想转换传递给函数的变量。
其他时候我想要一个应用了转换的新变量。

结果,我最终每次都创建两个函数,并遵循我的约定,其中 As_ 获取并返回一个拷贝,而没有 As_ 获取并返回一个引用。

如何编写一个函数实现来处理这两种行为?

我对它的外观没有任何要求,但我希望有一种方法可以不依赖于我的 As_ 约定,理想情况下我只创建一个函数两个。


示例:
这是一个示例。
让我们采用 Uppercase()As_Upercased()

std::string str1 = "hello";
Uppercase(str1); //str is now "HELLO"

std::string str2 = "hello";
auto str3 = As_Uppercased(str2); //str2 is still "hello",
//but str3 is "HELLO"

我不知道合并后的界面会是什么样子,但也许:

std::string str1 = "hello";
Uppercase<REF>(str1); //str is now "HELLO"

std::string str2 = "hello";
auto str3 = Uppercase<COPY>(str2); //str2 is still "hello",
//but str3 is "HELLO"

或者也许我可以用引用包装器做点什么。
我要问的是可能的实现方式。

最佳答案

您可以通过在 std::reference_wrapper 上提供重载来告诉编译器如何区分这两者。然后代码看起来像这样,例如:

#include <iostream>
#include <functional>

using T = std::string;

T Transform(T t)
{
t += " copy";
return t;
}

std::reference_wrapper<T> Transform(std::reference_wrapper<T> t)
{
t.get() += " ref";
return t;
}

int main()
{
T t{"original"};

std::cout << Transform(Transform(t)) << "\n";
std::cout << t << "\n";
std::cout << Transform(Transform(std::ref(t))).get() << "\n";
std::cout << t;
}

输出:

original copy copy
original
original ref ref
original ref ref

请注意,原始值如何在第一个调用链之后保持原样并在第二个调用链之后被修改。

在您的实际代码中,第一个重载只会调用第二个重载来转换其使用 std::ref 包装的复制传递参数以避免代码重复。

LIVE

关于c++ - 如何结合就地转换和复制转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33876043/

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