将constexpr compile-string转换为模板字符列表

时间:2015-10-18 20:34:49

标签: c++ template-meta-programming constexpr

Scott Schurr实现了编译时字符串:

public static int findMinCoins(int[] currency, int amount) {
    int min = findMinCoins(currency, amount, 0);
    System.out.print("The coins used were: ");
    return min;
}
private static int findMinCoins(int[] currency, int amount, int min){
    int number, value1, value2;
    int min1 = min;
    for(int i=currency.length-1; i>=0; i--) {
        if (amount>=currency[i]){
            amount = amount - currency[i];
            System.out.print(currency[i] + " ");
            min1 = findMinCoins(currency, amount, min1);
            return ++min1;
        }
    }
    return min1;
}

这很好,但我想在class str_const { const char* const p_; const std::size_t sz_; public: template <std::size_t N> constexpr str_const(const char(&a)[N]) : p_(a), sz_(N-1) {} constexpr char operator[](std::size_t n) { return n < sz_ ? p_[n] : throw std::out_of_range(""); } constexpr std::size_t size() { return sz_; } }; 这样的编译时字符列表上运行。 有没有办法将string<'H', 'e', 'l', 'l', 'o'>转换为此类列表?

我能想到的实现路线是模板和功能。通过模板将str_const转换为其他内容是不可能的,因为str_const是非类型模板参数的无效类型。此外,定义此类函数也是不可能的,因为根据其参数的值,它将具有不同的返回值str_const

UPD。编辑以摆脱“你的问题可能是重复的”消息,因为从这个问题的文本中可以明显看出字符串不是整数。

1 个答案:

答案 0 :(得分:1)

我认为这应该是可能的。您可以在常量表达式中使用这些constexpr字符串类型。因此,您可以将g.plot(graph.data.values(x=values[0], y=values[1])) 传递给期望积分参数的模板。

因此,您应该能够创建从0到str[0]的范围模板。然后,你会对重复调用concat构建一个构建mpl :: string的东西进行递归实例化。

实现这一点需要一段时间,所以我现在不打算提供代码,但我认为这个想法是可行的。这是我的字符串实现可能有所帮助。该代码具有测试,证明它可以在您尝试使用它的上下文中使用。

https://crazycpp.wordpress.com/2014/10/17/compile-time-strings-with-constexpr/ https://github.com/crazy-eddie/crazycpp/tree/master/20141016-constexprstr