使用模板化结构作为静态constexpr成员的模板参数

时间:2017-12-18 20:27:07

标签: c++ templates

我正在尝试设置模板结构的static constexpr成员,该模板结构由模板参数指定,模板参数本身就是模板结构。例如:

template<int f>
struct Column
{
    static constexpr int flags = f;
};

template<Column<int> c> // Error: Template argument for non-type template parameter must be an expression
struct Row
{
    static constexpr Column<int> column = c; // Error: Template argument for non-type template parameter must be an expression
};

这用于创建包含信息的其他结构,例如:

struct Table
{
    static constexpr Column<5> myCol();
    static constexpr Row<myCol> myRow(); // Error: Value of type 'Column<5> ()' is not implicitly convertible to 'int'
};

Xcode给出了评论中描述的错误。我认为我想要实现的目标应该相当清楚,但我该如何正确实现呢?我希望Column<int>的模板参数是通用的(例如,不使用Column<5>),这样任何生成的Column<int>实例都可以用作Row的模板参数。

编辑:更多上下文以更好地处理XY问题:

我正在创建代表SQLite列的模板化结构。这些模板结构将具有列名,标志,默认值等。这是上面的Foo类,非常简单。

然后我将为SQLite行创建类似的结构。这些结构需要知道它们属于哪个列以了解它具有哪些标志(NOT NULLPRIMARY KEY和类似的东西),如果有的话,它具有默认值,依此类推。因此,我想将列结构(即Foo<int>)作为模板参数传递给行结构(上例中的Bar)。

2 个答案:

答案 0 :(得分:1)

的std :: integral_constant

让我们看一个例子:

template <std::size_t index>
class column: public std::integral_constant<std::size_t, index>
{
    ...
};

然后,当传递到行时,反之亦然,请使用:

template <std::size_t column_index>
class row 
{
    ...
};

现在,让我们使用它:

row<column<1>{}> myrow;

注意{},它会创建column的实例,但它会自动衰减到std::size_t

问题在于人们仍然可以直接在索引中使用它,因此您可能希望在代码库中对此进行铿锵有序的检查。

模板元编程

也可以使用部分特化。

template <typename column_t>
class row;

template <std::size_t column_index>
class row<column<column_index>>
{
    ...
}

答案 1 :(得分:0)

我想你想要像

这样的东西
template<int f>
struct Column
{
    static constexpr int flags = f;
};

template<int i>
struct Row
{
    static constexpr Column<i> col;
};

Column<int>是一种非敏感类型,因为它将int传递给期望类型int的值作为其参数的模板。