1

我想知道如何在一个类中初始化一个数组,其值可以在常量表达式中使用。这是我的问题的解释:

// The goal : initializing an array for a class
// whose values can be used as normal static const
// (as template parameters for example)

class MyClass
{
    public:
        static const unsigned int value = 42; // <- No problem here
        static const unsigned int array[3] = {100, 101, 102}; // <- How to initialize this static const array (with constexpr or metaprogrammation maybe ?)
        template<unsigned int T> inline void f() {std::cout<<"Hello, my value is "<<T<<std::endl;} // <- Simple function for demonstration purposes
        inline void fvalue() {f<value>();} // <- No problem here
        inline void farray() {f<array[1]>();} // <- Big problem here
};
//const unsigned int Class1::array[3] = {100, 101, 102}; // <- If I do this, I will initialize the array but farray() will not compile

在 C++ 2011 中有什么方法可以做到这一点吗?(可能使用 constexpr 或元编程?)

非常感谢 !

编辑:正如标题指定的那样,我需要array成为该类的成员(不是全局数组)。

4

2 回答 2

3

是的,你可以做到constexpr..

当它在类中初始化时,使其constexpr允许静态成员具有比整数或枚举类型更多的类型。特别是,该成员只需要是文字类型,并且初始化程序中的所有表达式都必须是常量表达式。所以这很好

class MyClass
{
    public:
        static constexpr unsigned int array[3] = {100, 101, 102};
        template<unsigned int T> inline void f() {
            std::cout<<"Hello, my value is "<<T<<std::endl;
        } // <- Simple function for demonstration purposes
        inline void farray() {f<array[1]>();}
};

// needs a definition out-of-class too. put it into a .cc file
constexpr unsigned int MyClass::array[3];
于 2012-08-04T03:34:18.137 回答
0

万一您想知道元编程示例可能是什么样子,这里有一个示例:

#include <iostream>

template<size_t... values>
struct number_list;

template<size_t value, size_t... values>
struct number_list<value, values...>
{
    static const size_t val = value;
    typedef number_list<values...> next;
};

template<size_t index, typename NumList>
struct indexer
{
    static const size_t val = indexer<index - 1, typename NumList::next>::val;
};

template<typename NumList>
struct indexer<0, NumList>
{
    static const size_t val = NumList::val;
};

template<typename NumList>
class MyClass
{
    public:
        template<size_t T> inline void f() 
        {
            std::cout << "Hello, my value is " << T << std::endl;
        }

        inline void farray() {f<indexer<1, NumList>::val>();}
};

int main()
{
        MyClass<number_list<3, 5, 6>> a;
        a.farray();
        return 0;
}
于 2012-08-04T04:15:10.333 回答