如何制作自定义关键字语句

Gur*_*n8r 1 c++ function curly-braces

我如何创建一个使用if/for/while语句等大括号的函数?我将此称为"关键字声明",因为我不知道还有什么可以称之为"关键字声明".

这意味着,例如,如果我想制作一个'重复'功能:

repeat(3)
{
    //do something
}
Run Code Online (Sandbox Code Playgroud)

我想一个更好的问题是,这可能吗?如果是这样,怎么会这样做呢?

Den*_*ank 6

您可以定义一个带有 1 个参数的宏:

#define repeat(COUNT) \
    for (unsigned int i = 0; i < (COUNT); ++i)
Run Code Online (Sandbox Code Playgroud)

并将后面的括号留空,预处理器将扩展以下示例:

repeat(3)
{
    //do something
}
Run Code Online (Sandbox Code Playgroud)

进入:

for (unsigned int i = 0; i < (3); ++i)
{
    //do something
}
Run Code Online (Sandbox Code Playgroud)

演示

  • 如果我写“repeat(++n)”会怎样?不,说真的,我喜欢这个答案并投了赞成票,但有人实际上可能会尝试这样做并陷入麻烦。 (4认同)
  • @Gurman8rrPleeeeeease,不要遵循这种愚蠢的建议。只要你能说_喵_,它就会咬你的屁股! (2认同)

Vin*_*ond 6

不要那样做[ #define repeat] - 不要试图改变你正在使用的编程语言的语法.这将使您的代码对其他任何人来说都不那么容易理解.


小智 6

您可以定义类似于python范围的范围:

// Range
// =====

#include <iterator>
#include <utility>

template<typename T>
class Range
{
    public:
    typedef T value_type;

    public:
    class iterator
    {
        public:
        typedef typename std::forward_iterator_tag iterator_category;
        typedef typename std::size_t size_type;
        typedef typename std::ptrdiff_t difference_type;
        typedef T value_type;
        typedef const T& reference;
        typedef const T* pointer;

        public:
        iterator(const T& value) noexcept
        :   m_value(value)
        {}

        reference operator * () const noexcept { return m_value; }
        pointer operator -> () const noexcept { return &m_value; }
        iterator& operator ++ () noexcept { ++m_value; return *this; }

        friend bool operator == (const iterator & a, const iterator b) noexcept {
            return a.m_value == b.m_value;
        }
        friend bool operator != (const iterator & a, const iterator b) noexcept {
            return a.m_value != b.m_value;
        }

        private:
        T m_value;
    };

    public:
    Range(const T& first, const T& last) noexcept
    :   m_first(first), m_last(last)
    {}

    Range(T&& first, T&& last) noexcept
    :   m_first(std::move(first)), m_last(std::move(last))
    {}

    Range(Range&& other) noexcept
    :   m_first(std::move(other.m_first)),
        m_last(std::move(other.m_last))
    {}

    Range& operator = (Range&& other) noexcept {
        m_first = std::move(other.m_first);
        m_last = std::move(other.m_last);
        return *this;
    }

    iterator begin() const noexcept { return  m_first; }
    iterator end() const noexcept { return m_last; }

    private:
    T m_first;
    T m_last;
};

template<typename T>
inline Range<T> range(T&& first, T&& last) noexcept {
    return Range<T>(std::move(first), std::move(last));
}


// Test
// ====

#include <iostream>

int main() {
    for(auto i : range(0, 3))
        std::cout << i << '\n';
}
Run Code Online (Sandbox Code Playgroud)

更复杂的实现也会考虑容器和迭代器.