如何制作自定义关键字语句
How to make custom keyword statement
我怎么去做一个函数,使用括号像if/for/while语句?我把它称为"关键字语句",因为我不知道该怎么称呼它。
意思是,例如,如果我想创建一个'repeat'函数:
repeat(3)
{
//do something
}
我想一个更好的问题是,这可能吗?如果是这样,我们该怎么做呢? 不要这样做[#define repeat
] -不要试图改变您正在使用的编程语言的语法。这会使你的代码对其他人来说可读性差很多。
您可以定义一个类似于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';
}
更复杂的实现也会考虑容器和迭代器
你可以定义一个只有一个参数的宏:
#define repeat(COUNT)
for (unsigned int i = 0; i < (COUNT); ++i)
后的括号为空,预处理器将展开以下示例:
repeat(3)
{
//do something
}
为:
for (unsigned int i = 0; i < (3); ++i)
{
//do something
}
相关文章:
- Visual Studio 2015:Extern "C" 和 "export" 关键字
- C++中的"inline"关键字
- 如何确保C++函数在定义之前声明(如override关键字)
- 我的简单if-else语句是如何无法访问的代码
- 有一个打印语句的函数是一种糟糕的编程实践吗
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- 为什么是0;C++中的有效语句
- Insert函数不适用于2 if语句C++
- If语句未被求值C++
- C++嵌套if语句,基本货币交换
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 是否可以使用if constexpr删除控制流语句
- 无法理解此 return 语句的功能,没有它就会发生运行时错误
- 我似乎对if/else的基本语句有问题:/
- 当调用switch语句中的函数时(即使函数不包含循环),似乎是永不结束的循环的问题
- return语句中可以省略return关键字
- 如何制作自定义关键字语句
- 在switch语句中使用operator关键字
- 关键字之后"return"语句会被执行吗?
- C++中没有关键字的语句块