gpt4 book ai didi

c++ - 有没有办法将模板的替换失败转换为 bool 值(真/假)或标签(std::true_type/std::false_type)

转载 作者:行者123 更新时间:2023-11-30 01:03:19 24 4
gpt4 key购买 nike

我在 C++17 风格的 SFINAE 上“玩”了一点,我试图获得一个结果,在这个结果中,替换失败不仅仅是导致编译器移动到下一个案例,而是导致“编译器”(相反,一个经历过这种尝试的类)报告(通过 false/std::false_type)替换失败,然后编译器才移动到下一个案例。

我目前的尝试归结为:

template <typename T>
class logic_value
{
static constexpr bool result = std::is_same<
std::enable_if_t<T, std::true_type>,
std::true_type>;
};

template <typename T>
inline constexpr bool lv = logic_value<T>::result;

(用法示例:)

template <typename T>
std::enable_if_t<
lv<decltype(std::declval<T>() + std::declval<T>())> /* has plus operator */
&&
(lv<decltype(std::declval<T>().func_foo())> || lv<decltype(std::declval<T>().func_bar())>) /*has either func_foo() or func_bar() */
&&
lv<T&> /* can have a reference */
&&
(!lv<decltype(std::declval<T>().func_foobar())>) /* does NOT have a func_foobar() */
, T> const & Ioo(T const &);

但它并没有像我想象的那样工作......:/特别棘手的是当我使用 logic not(!) 运算符来确保测试类型中的某些内容不存在时的情况。

最佳答案

做到这一点的方法是使用检测成语,你想要is_detected使用适当的别名。

在您的具体情况下:

template <typename T> using has_plus_t = decltype(std::declval<T>() + std::declval<T>());
template <typename T> using func_foo_t = decltype(std::declval<T>().func_foo());
template <typename T> using func_bar_t = decltype(std::declval<T>().func_bar());
template <typename T> using func_foobar_t = decltype(std::declval<T>().func_foobar());

template <typename T>
enable_if_t<
is_detected_v<has_plus_t, T>
&&
(is_detected_v<func_foo_t, T> || is_detected_v<func_bar_t, T>)
&&
is_detected_v<add_lvalue_reference_t, T>
&&
!is_detected_v<func_foobar_t, T>
, T> const & Ioo(T const &);

你不能在这个上下文中有你想要测试的表达式,因为一旦一个失败,整个事情就会失败。你的逻辑允许并要求某些表达式失败 - 所以你需要控制所有的实例化这些表达。这就是检测成语的用途。

关于c++ - 有没有办法将模板的替换失败转换为 bool 值(真/假)或标签(std::true_type/std::false_type),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53882399/

24 4 0