【问题标题】:C++ macro to convert a string to list of charactersC ++宏将字符串转换为字符列表
【发布时间】:2011-05-31 17:01:18
【问题描述】:

是否可以有一个宏:

CHAR_LIST(鸡肉)

展开为:

'c'、'h'、'i'、'c'、'k'、'e'、'n'

[我想要它的原因:因为即使是中等大小的字符串,宏也比手动扩展方便得多。我需要扩展的原因是将字符串传递给可变参数模板]

【问题讨论】:

  • 这里需要一个可变参数模板,因为.....
  • 您是否尝试过在文本编辑器中创建某种宏来为您执行此操作?
  • 我目前正在研究解决方案,但为什么您需要将其传递给可变参数模板?这可能很重要。
  • @Xeo,我正在尝试在编译时进行字符串切换——case 语句就像 case_statement(...functor if this case is true...)
  • @Heptic:如果你只有一个可以迭代的数组可以吗? :)

标签: c++ c macros


【解决方案1】:

回答者的更新,2015 年 7 月:由于上述问题本身的 cmets,我们可以看到真正的问题与宏本身无关。提问者想要解决的真正问题是能够将文字字符串传递给接受一系列字符作为非类型模板参数的模板。这是解决该问题的ideone 演示。那里的实现需要 C++14,但很容易将其转换为 C++11。

------------

我认为我们需要一个更清晰的示例来说明如何使用此宏。我们需要一个可变参数模板的例子。 (另一个更新:即使打开了 c++0x 支持,这个 won't work 对我在可变参数模板中的 g++ 4.3.3 上也不起作用,但是我认为无论如何这可能很有趣。)

#include<iostream> // http://stackoverflow.com/questions/6190963/c-macro-to-convert-a-string-to-list-of-characters
#include "stdio.h"

using namespace std;

#define TO_STRING(x) #x
#define CHAR_LIST_7(x)   TO_STRING(x)[0] \
                       , TO_STRING(x)[1] \
                       , TO_STRING(x)[2] \
                       , TO_STRING(x)[3] \
                       , TO_STRING(x)[4] \
                       , TO_STRING(x)[5] \
                       , TO_STRING(x)[6] \

int main() {
        cout << TO_STRING(chicken) << endl;
        printf("%c%c%c%c%c%c%c", CHAR_LIST_7(chicken));
}

定义d 的行是您感兴趣的。我已经包含了其他示例来展示它是如何构建的。我很好奇 @GMan 的自动计数过程链接。

【讨论】:

  • 非常有趣,如果这可以扩展为自动计算字符串长度它似乎是解决方案:) /me 去尝试
  • 此宏可用作数组初始化器,但不能用于可变参数模板。
  • 实际上它确实适用于可变参数模板。示例:hpaste.org/47313/exand
  • @Heptic,我不断收到error: an array reference cannot appear in a constant-expression 错误。你用什么编译器?我在 g++ (Ubuntu 4.3.3-5ubuntu4) 4.3.3 和 --std=gnu++0x
【解决方案2】:

不,抱歉,无法完成。没有将字符串拆分为字符的操作。最接近的方法是通过递归元编程,但这会将数组作为对象,而不是实际的文本表示。

【讨论】:

  • +1:另一种选择是构建过程中的独立代码生成步骤。
  • 如果它真的需要那将是最好的,而且不知何故我认为在代码中有'c', 'h', 'i', 'c', 'k', 'e', 'n'不值得麻烦:)
  • 有一个分割成字符的操作。请参阅我的(笨拙的)答案。 -1 表示过度悲观 - 我希望这看起来是合理的。
  • @Aaron,也许您没有看到对已删除答案的评论,其中 Heptic 解释说这些字符是模板参数。在这种情况下,您的答案不起作用,使这个答案更正确。不值得-1。
  • 我正在撤消我的反对票。我仍然认为答案应该解释原因,而不仅仅是说“不,抱歉,做不到”。我在 SO 上看过几次,没有根据。我以前从未在 SO 上注意到 Blindy。我想我以后会相信@Blindy :-)
猜你喜欢
  • 2020-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-31
  • 1970-01-01
  • 1970-01-01
  • 2013-12-05
  • 1970-01-01
相关资源
最近更新 更多