在宏中声明类和它的静态const

时间:2014-04-05 07:37:29

标签: c++ c++11 macros

我有课

struct testdb1 {
    typedef tuple<int, double> value_type;
    static const value_type data[];
};
const testdb1::value_type testdb1::data[] = {
    make_tuple(1, 1.1),
    make_tuple(2, 2.2),
    make_tuple(3, 3.3),
    make_tuple(3, 3.3)

};

现在,我希望能够以更紧凑的方式定义它,我会想象这样的事情:

STATIC_DB(
    testdb1,
    make_tuple(1, 1.1),
    make_tuple(2, 2.2),
    make_tuple(3, 3.3),
    make_tuple(3, 3.3)
)

我猜宏是可行的方法,但我不知道如何编写(如果可能的话)这样的东西。如果这可以用模板做,那会更好,但我不知道如何。

提前感谢您的帮助

3 个答案:

答案 0 :(得分:1)

可能有更好的方法可以做到这一点,但你可以像这样使用

#define TUPLE(first,second) make_tuple(first,second),
#define TUPLE_LAST(first,second) make_tuple(first,second)
#define STATIC_DB(type,tuples) \
        struct type{\
                typedef tuple<int,double> value_type;\
                static const value_type data[];\
        };\
        const type::value_type type::data[]=\
                tuples;

STATIC_DB(
    testdb1,
    {
        TUPLE(1, 1.1)
        TUPLE(2, 2.2)
        TUPLE(3, 3.3)
        TUPLE_LAST(3, 3.3)
    }
)

格式化输出:

struct testdb1{ 
    typedef tuple<int,double> value_type; 
    static const value_type data[]; 
}; 

const testdb1::value_type testdb1::data[]= { 
      make_tuple(1,1.1), 
      make_tuple(2,2.2), 
      make_tuple(3,3.3), 
      make_tuple(3,3.3) 
};

答案 1 :(得分:1)

使用constexpr,您可以执行以下操作(紧凑且清晰):

struct testdb1 {
    static constexpr tuple<int, double> data[] =
    {
        make_tuple(1, 1.1),
        make_tuple(2, 2.2),
        make_tuple(3, 3.3),
        make_tuple(3, 3.3)
    };
};

答案 2 :(得分:0)

你可以试试这个:

#define STATIC_DB(t1_, t2_, T_, ...)                                    \
    struct T_ {                                                         \
        typedef tuple<t1_, t2_> value_type;                             \
        static const value_type data[];                                 \
    };                                                                  \
    const T_::value_type T_::data[]   = {                               \
        __VA_ARGS__                                                     \
    };

STATIC_DB(int, double, testDB, make_tuple(1, 1.1), make_tuple(2, 2.2) );