首页 > 解决方案 > 在 C++ 模板中省略空 <>

问题描述

有没有办法<>在 C++11 中省略一个空来使语法更好,这意味着编写Foo而不是Foo<>模板类。

我很清楚我可以重命名/命名空间等。但我想优化掉两个字符,而不是用新名称混淆用户或强迫他输入比以前更多的内容。

完整示例:

template<int N = 1>
class Foo{};

using Foo = Foo<>;
int main()
{
  Foo foo; // I want to be able to write this.
  Foo<> foo; // Works but is ugly.
}

标签: c++c++11templates

解决方案


您只有一个选项可以使此语法正常工作,那就是切换到C++17。然后你可以省略模板参数,因为默认模板参数总是可以作为新类模板参数推导的一部分进行推导(有时称为“推导指南”)。

template<int N = 1>
class Foo{};

int main() {
    { Foo foo; }
    { Foo<> foo; }
}

活在魔杖盒上


根据您可以做出的权衡,有两种适用于C++11的解决方案。

  1. 为别名模板使用不同的名称。

    template<int N = 1>
    class Foo{};
    
    using FooNoArgs = Foo<>;
    
    int main() {
        { FooNoArgs foo; }
        { Foo<> foo; }
    }
    

    活在魔杖盒上

  2. using如果您需要访问模板化变体,则将模板移动到其自己的命名空间并结合本地命名空间。

    namespace foo {
    template<int N = 1>
    class Foo{};
    }
    
    using Foo = foo::Foo<>;
    
    int main() {
        { Foo foo; }
        { using foo::Foo; Foo<> foo; }
    }
    

    活在魔杖盒上


推荐阅读