【发布时间】:2021-07-03 18:58:19
【问题描述】:
我试图通过将有关类的一些信息定义为静态 constexpr 成员来简化一些模板代码。这是一个非常简化的示例:
template <typename _Tp>
class Test
{
public:
static constexpr bool is_array = std::is_array_v<_Tp>;
template <typename U = _Tp, typename std::enable_if_t<!is_array>>* dummy = nullptr>
void print()
{
std::cout << "It's not an array\n";
}
template <typename U = _Tp, typename std::enable_if_t<is_array>>* dummy = nullptr>
void print()
{
std::cout << "It's an array\n";
}
};
int main()
{
Test<char[]>().print();
Test<char>().print();
}
叮当说
/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/type_traits:2385:44: error: no type named 'type' in 'std::enable_if<false, void>'; 'enable_if' cannot be used to disable this declaration
using enable_if_t = typename enable_if<_Cond, _Tp>::type;
^~~~~
test.cc:11:49: note: in instantiation of template type alias 'enable_if_t' requested here
template <typename U = _Tp, typename = std::enable_if_t<!is_array>>
^
test.cc:26:5: note: in instantiation of template class 'Test<char []>' requested here
Test<char[]>().print();
如果我完全符合is_array 的条件,它就可以工作,就像Test<U>::is_array 一样,但是我有几个模板参数,这样做似乎会让事情变得更加混乱。
除了使用宏之外,还有什么方法可以做我所追求的吗?
【问题讨论】:
-
单个
print()里面有if constexpr分支怎么样? -
@bipll 是的,在这种情况下可以。我必须使用 if constexpr 将一堆 SFINAE 选择的方法组合成大型方法。不过,它确实可以编译和工作。我正在寻找一种方法让编译器选择正确的方法。
-
我最终重构了我的代码以更好地使用 if constexpr,这似乎是做我想做的最干净的方式。