gpt4 book ai didi

c++ - SFINAE 允许吗?

转载 作者:搜寻专家 更新时间:2023-10-31 00:24:32 24 4
gpt4 key购买 nike

我正在尝试使用 std::enable_if 从类模板中删除成员函数。当我禁用一个功能时,我得到错误:

C2938: 'std::enable_if_t<false,int64_t>' : Failed to specialize alias template

我的代码是这样的:

template<int NUM_COMPONENTS>
struct Foo
{
typename std::enable_if_t<(NUM_COMPONENTS == 2), void> set(int64 x, int64 y)
{
// some code here
}
}

我是否在做一些标准不允许的事情,如果是这样,还有其他方法吗?或者这是一个错误?我将 MSVC 与 QtCreator 结合使用。

最佳答案

SFINAE 中的 S 代表模板参数替换模板参数,当模板被认为是重载解析的候选者时,这是为模板参数完成的。

Foo 是模板,但 set 不是。发生的情况是您实例化 Foo,它实例化 set 的声明,并且该函数包含无效的返回类型。没有 SFINAE,因为在重载解析之前不会发生这种替换。

要应用 SFINAE,您必须制作set 模板:

template<int NUM = NUM_COMPONENTS>
std::enable_if_t<(NUM== 2), void> set(int64 x, int64 y)
{
// some code here
}

现在你得到了一个有效的声明(模板)。但是当您尝试调用它时,将发生另一个替换,SFINAE 适用于此。

作为奖励,C++20 使这个练习没有实际意义。一个简单的 requires 子句就可以实现您想要实现的目标:

void set(int64 x, int64 y) requires (NUM_COMPONENTS == 2)
{
// some code here
}

关于c++ - SFINAE 允许吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58007640/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com