gpt4 book ai didi

c++ - 将返回类型专门化为 void 或 const 左值引用

转载 作者:行者123 更新时间:2023-12-02 12:00:53 24 4
gpt4 key购买 nike

我正在努力完成以下任务..

enum class Options : uint8_t {    
optA,
optB,
optC
};

class Test {
public:

static std::string str;
static std::vector<std::string> vec;

template<Options option>
static auto func()
{
if constexpr (option == Options::optA)
{
return str; // want this to deduce to 'const std::string', but only does so if 'const auto' (const std::string& also fine though)
}
else if constexpr (option == Options::optB)
{
return vec; // want this to deduce to 'const std::vector<std::string>&' but only does so if 'const auto&'
}

// want this to deduce to 'void' but only can if 'auto'
}
}

但当然,由于评论的原因,它不起作用。

我知道我可以...

1)为每个选项专门化类体之外的函数,并特意指定返回类型

或者2)调用函数时显式传入返回类型

但是有没有更干净的解决方案,我需要做的就是将单个 Options 值传递到模板中,其余部分在单个函数体内派生?

const std::string& value = Test::func<Options::optA>();
const std::vector<std::string>& values = Test::func<Options::optB>();
Test::func<Options::optC>();

最佳答案

对于非静态 func() ,您可以将其标记为 const并使用decltype(auto)扣除:

template<Options option>
decltype(auto) func() const
{
if constexpr (option == Options::optA)
return (str);
else if constexpr (option == Options::optB)
return (vec);
}

strvec带括号,这样 decltype(auto)推导出引用类型。对于 optA它将返回const std::string& ,对于optBconst std::vector<std::string>& ,和void否则。

Demo 1

<小时/>

对于静态成员函数和静态成员,您可以编写:

template<Options option>
static decltype(auto) func()
{
if constexpr (option == Options::optA)
return std::as_const(str);
else if constexpr (option == Options::optB)
return std::as_const(vec);
}

Demo 2

关于c++ - 将返回类型专门化为 void 或 const 左值引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59584740/

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