我有以下问题:我有一个包含一个基类和两个子类的类层次结构。我已经实现了一个resolve_type
接受基类实例和通用 lambda(或类似)的函数。该函数解析其类型并将其传递给 lambda。在这个 lambda 中,我想在 constexpr-if 条件下检查列的类型,以排除某些类型。我曾尝试使用子类中的 constexpr 成员函数来做到这一点,但不幸的是没有奏效。
代码:
class AbstractColumn
{
};
template <typename Type>
class DataColumn : public AbstractColumn
{
public:
constexpr bool is_reference_column() { return false; }
void foo() {}
};
class ReferenceColumn : public AbstractColumn
{
public:
constexpr bool is_reference_column() { return true; }
};
template <typename Functor>
resolve_type(const AbstractColumn & col, const Functor & func);
用法:
AbstractColumn & col = ...;
...
resolve_type(col, [] (const auto & col)
{
// col could be ReferenceColumn, DataColumn<int>, DataColumn<float>, DataColumn<double>, DataColumn<std::string> ...
if constexpr (!col.is_reference_column()) {
col.foo();
}
});
编译器错误:
Apple LLVM version 8.1.0 (clang-802.0.42)
error: constexpr if condition is not a constant expression
if constexpr (col.is_reference_column()) {
我知道我可以decltype
用来获取类型,然后继续使用一些模板魔法,但我希望找到一些更具可读性的东西。我的项目已经使用了 boost 和它的 hana 库,所以解决方案也可以使用这两个。有没有人有任何想法?