gpt4 book ai didi

C++ 与部分模板特化语法混淆

转载 作者:行者123 更新时间:2023-11-28 05:18:30 25 4
gpt4 key购买 nike

有没有一种方法可以避免使用 Range2 作为名称并将两个类都命名为 Range?我对 C++ 模板语法有点困惑。

template <int BEGIN, int END>
class Range2
{
public:
class Iterator
{
private:
int n;

public:
Iterator(int n)
: n(n)
{
}

int operator *() const
{
return n;
}

Iterator const & operator ++()
{
++n;
return *this;
}

bool operator !=(Iterator const & i) const
{
return n != i.n;
}
};

Iterator begin() const
{
return Iterator(BEGIN);
}

Iterator end() const
{
return Iterator(END);
}
};

template<int END>
class Range
: public Range2<0, END>
{
};

最佳答案

与函数参数一样,在 C++ 中,模板参数可以有一个默认值。您唯一需要为此付出代价的是将没有默认值的 END 放在默认值为 0 的 BEGIN 之前。

// Here we add the default parameter to BEGIN
// The arguments are switched because END is without a default
// parameter, so it has to come before BEGIN that has one
template <int END, int BEGIN=0>
// The class itself is the same, but now you can use it
// without giving a BEGIN parameters
class Range
{
public:
class Iterator
{
private:
int n;

public:
Iterator(int n)
: n(n)
{
}

int operator *() const
{
return n;
}

Iterator const & operator ++()
{
++n;
return *this;
}

bool operator !=(Iterator const & i) const
{
return n != i.n;
}
};

Iterator begin() const
{
return Iterator(BEGIN);
}

Iterator end() const
{
return Iterator(END);
}
};

它编译并且应该按预期工作。不过,如果没有 main,我无法对其进行测试。

编辑:为了清楚起见,我添加了一些评论和这里的用法示例:

Range<10, 3> r(3); /*here we use it as usual, pay attention begin is 
now the second argument and not the first */
Range<10> r(0); /* here we don't give a BEGIN argument, the
compiler will use the default one */

关于C++ 与部分模板特化语法混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42046802/

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