c++ - inline放在哪好

本文探讨了C++中内联函数的最佳实践方法,强调了将内联关键字置于函数定义而非声明处的重要性。这种做法有助于清晰地区分类的公共接口与其实现细节。

Best practice: only in the definition outside the class body.

 class Foo {
 public:
   void method();  
 best practice: don't put the inline keyword here
   
...
 };
 
 inline void Foo::method()  
 best practice: put the inline keyword here
 { ... }

Here's the basic idea:

  • The public: part of the class body is where you describe the observable semantics of a class, its public member functions, its friend functions, and anything else exported by the class. Try not to provide any inklings of anything that can't be observed from the caller's code.
  • The other parts of the class, including non-public: part of the class body, the definitions of your member and friend functions, etc. are pure implementation. Try not to describe any observable semantics that were not already described in the class's public: part.

From a practical standpoint, this separation makes life easier and safer for your users. Say Chuck wants to simply "use" your class. Because you read this FAQ and used the above separation, Chuck can read your class's public: part and see everything he needs to see and nothing he doesn't need to see. His life is easier because he needs to look in only one spot,and his life is safer because his pure mind isn't polluted by implementation minutiae.

Back to inline-ness: the decision of whether a function is or is not inline is an implementation detail that does not change the observable semantics (the "meaning") of a call. Therefore the inline keyword should go next to the function's definition, not within the class's public: part.



http://www.parashift.com/c++-faq-lite/inline-functions.html

<think>好的,我现在需要处理用户关于正则表达式(regexp)内联功能的使用和示例的问题。首先,我得确认用户的具体需求是什么。他们提到“regexp inline”,可能是指如何在编程中内联使用正则表达式,比如在代码中直接写正则表达式而不是通过字符串或者变量。不过,“inline”在不同的上下文可能有不同的含义,比如在C++中的内联函数,或者在正则表达式语法中的内联修饰符。用户还提到了想了解使用例子,所以我需要先明确这一点。 接下来,我需要回忆正则表达式中内联修饰符的常见用法。例如,在正则表达式中,可以通过内联修饰符来改变匹配规则,比如在某个子组中使用`(?i)`来开启忽略大小写,或者`(?-i)`来关闭。例如,`(?i)hello`会匹配"hello"、"Hello"、"HELLO"等。此外,不同的编程语言可能对正则表达式的内联修饰符支持有所不同,比如JavaScript、Python、Java等。因此,我需要给出不同语言中的示例,这样用户可以根据自己使用的语言进行参考。 另外,用户可能还指的是在代码中直接内联编写正则表达式,而不是先将其存储在变量中。例如,在Python中直接使用`re.search(r'\d+', text)`,这里的`r''`表示原始字符串,常用于正则表达式。这种情况下,内联指的是直接在函数调用中写入正则表达式,而不是先定义变量。但根据用户引用的参考内容中的例子,如`anyOf(fooList, [](Foo foo) { return foo.isGreat(); })`,看起来用户可能关注的是如何在代码中内联使用正则表达式,比如在函数调用中直接写正则表达式,或者内联修饰符的使用。 再查看用户提供的引用,其中引用[1]提到使用缓冲区名称的正则表达式来捕获magit的不同主模式,例如使用正则表达式来匹配缓冲区名称。这可能涉及到在配置或代码中使用正则表达式作为参数,直接内联传入。引用[2]中的代码片段是C++的lambda函数,用户可能想知道如何在类似的情况下内联使用正则表达式,比如在函数调用中直接定义正则表达式。 因此,我需要分两部分回答:一是正则表达式的内联修饰符,即在正则表达式内部使用修饰符来改变匹配模式;二是在编程中内联使用正则表达式,即在代码中直接写入正则表达式而不是先定义变量。 首先,内联修饰符的例子。例如,在正则表达式中使用`(?i)`来忽略大小写,`(?m)`启用多行模式,`(?s)`让`.`匹配换行符等。这些修饰符可以放在正则表达式的特定位置,影响其后的匹配规则。例如,在Python中,`re.findall(r'(?i)hello', 'Hello, hELlo')`会匹配所有大小写形式的hello。 其次,在代码中内联使用正则表达式,比如在JavaScript中直接写`/pattern/flags`,或者在Java中使用`Pattern.compile("(?i)hello")`。这种情况下,内联指的是直接在代码中编写正则表达式,而不是先将其赋值给变量。 同时,需要提供不同编程语言的示例,如Python、JavaScript、Java、C#等,以覆盖用户可能使用的语言环境。每个示例应展示如何在代码中内联使用正则表达式,包括修饰符的应用。 此外,用户的问题可能还涉及到正则表达式的内联标记在替换操作中的应用,例如在替换字符串中使用`\U`或`\L`来转换大小写,但这可能属于高级用法,需要确认是否有必要提及。 最后,生成相关问题,比如如何在不同语言中使用内联修饰符,性能考虑,或者常见的陷阱等。 在编写回答时,需要确保遵循用户提供的系统级指令:行内数学表达式用$...$,独立公式用$$...$$,但在这个问题中可能用不上数学公式。但需要检查是否有需要用到数学符号的地方,例如在解释正则表达式语法时,如果有涉及的话。不过,正则表达式通常不涉及数学公式,所以可能可以忽略这部分。 同时,回答需要使用中文,结构清晰,分点说明,并引用提供的参考资料。引用标识应自然地添加在引用的段落末尾,如引用[1]和引用[2]。需要确认用户提供的引用内容是否与问题相关,并正确引用。例如,引用[1]提到使用正则表达式来匹配缓冲区名称,这可以作为内联使用正则表达式的一个应用场景的例子,而引用[2]中的代码示例可能与内联函数有关,但需要看如何关联到正则表达式的内联使用。 总结步骤: 1. 解释正则表达式的内联修饰符,给出不同语言的示例。 2. 展示在代码中内联使用正则表达式的方式,例如直接在函数调用中写入正则表达式。 3. 提供应用场景的例子,如配置文件中使用正则表达式匹配缓冲区名称(引用[1])。 4. 生成相关问题,帮助用户深入理解。 需要确保每个示例的语法正确,并且覆盖不同的编程语言。同时,引用用户提供的参考资料,例如在讨论应用场景时提到引用[1]中的例子。</think>### 正则表达式的内联功能及编程示例 正则表达式的内联功能通常指两种场景: 1. **在正则表达式语法中使用内联修饰符**,例如 `(?i)` 忽略大小写 2. **在代码中直接内联编写正则表达式**(而非通过变量定义) --- #### 一、正则表达式的内联修饰符 通过在正则表达式中插入 `(?修饰符)` 的语法,可以**局部修改匹配规则**,作用范围从其位置开始到表达式结束或作用域结束。常见修饰符: - `i`: 忽略大小写(如 `(?i)hello` 可匹配 `Hello` 或 `HELLO`) - `m`: 多行模式(`^` 和 `$` 匹配每行的开头和结尾) - `s`: 单行模式(`.` 可匹配换行符) - `U`: 非贪婪模式(部分语言支持,如 PHP) ##### 示例代码 1. **Python** ```python import re text = "Hello, hELlO World" matches = re.findall(r'(?i)hello', text) # 匹配 ['Hello', 'hELlO'] ``` 2. **JavaScript** ```javascript const text = "Hello, hELlO World"; const regex = /(?i)hello/gi; // 或直接使用修饰符 /hello/gi console.log(text.match(regex)); // 输出 ["Hello", "hELlO"] ``` 3. **Java** ```java String text = "Hello, hELlO World"; Pattern pattern = Pattern.compile("(?i)hello"); Matcher matcher = pattern.matcher(text); while (matcher.find()) { System.out.println(matcher.group()); // 输出 "Hello" 和 "hELlO" } ``` --- #### 二、代码中内联使用正则表达式 在编程时,可直接将正则表达式作为参数传递给函数,无需预先定义变量。这种方式简化代码结构,适用于简单场景。 ##### 示例代码 1. **Python 替换操作** ```python text = "Price: $100" new_text = re.sub(r'\$(\d+)', r'¥\1', text) # 替换为 "Price: ¥100" ``` 2. **C# 匹配邮箱** ```csharp string text = "Contact: user@example.com"; if (Regex.IsMatch(text, @"\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b", RegexOptions.IgnoreCase)) { Console.WriteLine("Valid email"); } ``` 3. **配置文件中的正则内联** 如引用[1]中提到的 Emacs 配置,通过正则表达式匹配缓冲区名称: ```lisp (add-to-list 'evil-emacs-state-modes '("^magit-.*")) // 所有以 "magit-" 开头的缓冲区使用 Emacs 模式[^1] ``` --- #### 三、注意事项 1. **作用域控制**:内联修饰符 `(?i)` 会影响其后的所有匹配,若需限定范围,可用 `(?-i)` 关闭。例如: `(?i)Hello(?-i)World` 会匹配 `helloWorld`,但拒绝 `HELLOWORLD`。 2. **语言差异**:部分修饰符(如 `s` 和 `U`)在不同语言中支持程度不同,需查阅文档[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值