gpt4 book ai didi

c++ - 有人说某事对 SFINAE 友好是什么意思?

转载 作者:IT老高 更新时间:2023-10-28 21:35:30 26 4
gpt4 key购买 nike

当有人提到某个特定函数、结构或 ... SFINAE 友好时,我无法清楚地理解它的含义。

谁能解释一下?

最佳答案

当它允许替换失败而没有硬错误时(如 static_assert )。

例如

template <typename T>
void call_f(const T& t)
{
t.f();
}

为所有 T 声明函数, 甚至那些没有 f 的, 所以你不能在 call_f<WithoutF> 上做 SFINAE因为该方法确实存在。 (Demo 的非编译代码)。

有以下变化:

template <typename T>
auto call_f(const T& t) ->decltype(t.f(), void())
{
t.f();
}

该方法适用于有效的 T。所以你可以将 SFINAE 用作

template<typename T>
auto call_f_if_available_impl(const T& t, int) -> decltype(call_f(t))
{
call_f(t);
}

template<typename T>
auto call_f_if_available_impl(const T& t, ...)
{
// Do nothing;
}

template<typename T>
auto call_f_if_available(const T& t)
{
call_f_if_available_impl(t, 0);
}

注意 int = 0...是命令重载。 Demo

--

另一种情况是模板添加特殊参数以应用SFINAE进行特化:

template <typename T, typename Enabler = void> struct S;

然后

// Specialization only available for T which respect the traits.
template <typename T>
struct S<T, std::enable_if_t<my_type_trait<T>::value>>
{
};

关于c++ - 有人说某事对 SFINAE 友好是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35033306/

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