代码之家  ›  专栏  ›  技术社区  ›  code_fodder

static auto constexpr t={“red”,“black”,“green”}是什么类型;派生到?

  •  0
  • code_fodder  · 技术社区  · 6 年前

    所以我在乱搞一些代码,我决定我想要一些字符串列表。。。所以我想-我不必费心去弄清楚要用什么类型等等,所以我只要把它敲成一个自动变量,像这样:

    static auto constexpr t = {"red", "black", "green"};

    static auto constexpr str = "green";

    派生到 char[] 我假设{“red”、“black”、“green}可能是一个*char[]或类似的字符,因此我可以写:

    std::cout << "value 1 is: " << t[1] << std::endl;

    这给了我一个错误:

    const std::初始值设定项(列表和int)

    所以我假设类型是“initializer\u list”?有什么方法可以让我做一些事情,比如: t[1]

    2 回复  |  直到 6 年前
        1
  •  1
  •   lubgr    6 年前

    所以我假设类型是“initializer\u list”?

    对。

    有没有一种方法可以像:t[1]这样得到字符串“black”(假设索引从0开始)?

    使用 std::array ,它与C++ 17类模板类型演绎很好地结合:

    static auto constexpr t = std::array{"red", "black", "green"};
    
    std::cout << t[1] << "\n"; // outputs 'black'
    

    constexpr -如果将编译时常量传递给 operator[] std::get .

    constexpr const char* black = t[1];
    constexpr const char* red = std::get<0>(t);
    
        2
  •  1
  •   Bob__    6 年前

    https://en.cppreference.com/w/cpp/utility/initializer_list

    operator[] 成员函数,但是,唯一的访问器 std::initializer_list::begin std::initializer_list::end

    #include <iostream>
    #include <initializer_list>
    #include <stdexcept>
    
    namespace my {
    
    template <typename T>
    constexpr auto get(std::initializer_list<T> lst, std::size_t i)
    {
        if ( i >= lst.size() )
            throw std::out_of_range("Out of bounds access.\n");
        return *(lst.begin() + i);   
    }
    
    template <std::size_t I, typename T>
    constexpr auto get(std::initializer_list<T> lst) 
    {
        // Note: https://stackoverflow.com/questions/5438671/static-assert-on-initializer-listsize
        if ( I >= lst.size() )
            throw std::out_of_range("Out of bounds access.\n");
        return *(lst.begin() + I);   
    }
    
    }
    
    int main()
    {
        // Note: https://stackoverflow.com/questions/16063123/is-it-legal-to-declare-a-constexpr-initializer-list-object
        static constexpr auto t = {"red", "black", "green"};
    
        std::cout << my::get(t, 1) << '\n' << my::get<2>(t) << '\n';
    }