gpt4 book ai didi

C++17 检查有效表达式

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:42:25 24 4
gpt4 key购买 nike

我的代码基于 thisthis ,我写了这个版本:

#include <iostream>
#include <boost/preprocessor.hpp>
#include <boost/callable_traits/is_invocable.hpp>

#define IS_VALID_EXPANDER_BEGIN(count) \
[](BOOST_PP_REPEAT(count, IS_VALID_EXPANDER_MIDDLE, \
_)) constexpr->decltype IS_VALID_EXPANDER_END

#define IS_VALID_EXPANDER_MIDDLE(z, idx, _) BOOST_PP_COMMA_IF(idx) auto _##idx

#define IS_VALID_EXPANDER_END(...) \
(__VA_ARGS__){})

#define IS_VALID(...) \
is_valid<__VA_ARGS__>(IS_VALID_EXPANDER_BEGIN( \
BOOST_PP_VARIADIC_SIZE(__VA_ARGS__))

template <typename... Ts, typename TF>
static constexpr auto is_valid(TF)
{
return boost::callable_traits::is_invocable<std::decay_t<TF>(Ts...), Ts...>{};
}

struct Test {};

int main()
{
std::cout << IS_VALID(std::ostream&, double)(_0 << _1) << std::endl;
std::cout << IS_VALID(std::ostream&, Test)(_0 << _1) << std::endl;
}

但是,结果是:

1
1

我不明白为什么。

最佳答案

您的 lambda 按值获取参数,这不允许您测试 std::ostream& << T .将您的宏更改为:

#define IS_VALID_EXPANDER_BEGIN(count)                    \
[](BOOST_PP_REPEAT(count, IS_VALID_EXPANDER_MIDDLE, \
&&_)) constexpr->decltype IS_VALID_EXPANDER_END

此外,您对 is_invocable 的使用是错误的——应该是:

template <typename... Ts, typename TF>
static constexpr auto is_valid(TF)
{
return boost::callable_traits::is_invocable<std::decay_t<TF>, Ts...>{};
}

(无论如何你应该使用 std::is_invocable,它在 C++17 中可用。)

live example on wandbox.org

关于C++17 检查有效表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53010475/

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