c – 在不使用宏的情况下减少语法“噪声”

c – 在不使用宏的情况下减少语法“噪声”,第1张

概述我试图找到一种方法来减少一些语法“噪音”而不诉诸宏.对于以下代码: struct base { base() = delete; }; struct tag1 final : private base{ static constexpr const char* name = "tag1";};template <typename T> std::string name() { 我试图找到一种方法来减少一些语法“噪音”而不诉诸宏.对于以下代码:
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;}

摆脱一些静态的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(); }

这确实减少了很多噪音,但需要写’t’,’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','1'>{using base::name;};struct tag2 final : private base<'t','2'>{using base::name;};

Demo

这样称呼它:

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

我必须在派生类中使用base :: name添加,因​​为您正在使用私有继承.如果继承变得受保护或公开,那么您不需要它.

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

总结

以上是内存溢出为你收集整理的c – 在不使用宏的情况下减少语法“噪声”全部内容,希望文章能够帮你解决c – 在不使用宏的情况下减少语法“噪声”所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1243835.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存