gpt4 book ai didi

c++ - 在不使用宏的情况下减少语法 "noise"

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:26:35 25 4
gpt4 key购买 nike

我正在尝试寻找一种无需借助宏即可减少语法“噪音”的方法。对于以下代码:

struct base { base() = delete; };    
struct tag1 final : private base
{
static constexpr const char* name = "tag1";
};
template <typename T> std::string name() { return T::name; }
// ...
int main()
{
const std::string name1(name<tag1>());
return 0;
}

最好摆脱一些 static constexpr const char*(更不用说其他)语法,因为为 tag2 重复该语法会很烦人>、tag3 等。另外,所有真正有趣的部分只有 tag1,其余部分是“噪声”。直接的解决方案使用宏:

#define MAKE_TAG(tag_name) struct tag_name final : private base { \
static constexpr const char* name = #tag_name; }
MAKE_TAG(tag2);
// ...
const std::string name2(name<tag2>());

基于宏的 MAKE_TAG(tag2); 语法消除了所有“噪音”,使 tag2 非常突出。宏的另一个好处是可以轻松地将 tag_name 转换为字符串文字,从而防止复制粘贴错误。

“明显”的可能解决方案可能是通过 name as a template argument

template<const char* name> base { ... };
struct tag3 final : private base<"tag3"> {};

但那是 not supported by C++ .一个聪明的解决方法,来自 answer下面,是使用可变参数模板:

template<char... S> struct base { base() = delete;
static std::string name() { return{ S... }; } };
struct tag4 final : base<'t', 'a', 'g', '4'> { };
template <typename T> std::string name() { return T::name(); }

这确实减少了很多噪音,但需要编写 '', 'a', 'g', '4' 而不是 "tag4"。运行时解决方案相当简洁

struct base {
const std::string name;
base(const std::string& name) : name(name) {} };
struct tag5 final : base { tag5() : base("tag5") {} };
template <typename T> std::string name() { return T().name; }

但这并不完全令人满意,因为现在可以实例化 tag5,这在理想情况下是没有意义的。此外,现在需要将 tag5 写三遍,这不是很 DRY .

有没有办法进一步简化(即减少输入)上面的代码? ...不使用宏?

最佳答案

如果您愿意单独输入字符,我们可以执行以下操作:

template<char... S>
struct base {
base() = delete;
static std::string name(){
return {S...};
}
};

struct tag1 final : private base<'t','a','g','1'>
{using base::name;};
struct tag2 final : private base<'t','a','g','2'>
{using base::name;};

Demo

这样调用它:

std::cout << tag1::name() << std::endl;
std::cout << tag2::name() << std::endl;

我必须在派生类中添加 using base::name 因为您使用的是私有(private)继承。如果继承变为 protectedpublic,那么您就不需要它了。

基础中name()函数的要点是创建一个字符数组,我们可以从中构造一个字符串。我们使用 variadic parameter pack expansion创建数组。

关于c++ - 在不使用宏的情况下减少语法 "noise",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43412919/

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