我正在尝试设置模板结构的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 NULL
,PRIMARY KEY
和类似的东西),如果有的话,它具有默认值,依此类推。因此,我想将列结构(即Foo<int>
)作为模板参数传递给行结构(上例中的Bar
)。
答案 0 :(得分:1)
让我们看一个例子:
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
的值作为其参数的模板。