gpt4 book ai didi

c++ - 如何专门化模板函数以区分void和non-void函数参数

转载 作者:行者123 更新时间:2023-12-02 09:54:56 25 4
gpt4 key购买 nike

我想拥有2个功能:接受void(*)(int)int(*)(int)
如何编写类似于std::is_invocable_r的type_trait,但要检查确切的返回类型(因为可以将任何函数强制转换为返回void的函数)。

#include <functional>
#include <type_traits>
#include <cstdio>

template <typename R, typename C, typename... Args>
constexpr bool is_exact_invocable_r_v =
std::is_same_v<R, std::invoke_result_t<C, Args...>>;
// std::is_invocable_r_v<R, C, Args...>;

template<typename C, std::enable_if_t<is_exact_invocable_r_v<int, C>, int> = 0>
void print(C)
{
printf("1\n");
}

template<typename C, std::enable_if_t<is_exact_invocable_r_v<int, C, int>, int> = 0>
void print(C)
{
printf("2\n");
}

template<typename C, std::enable_if_t<is_exact_invocable_r_v<void, C, int>, int> = 0>
void print(C)
{
printf("3\n");
}

int main()
{
print([](){return 0;});
print([](int){return 0;});
print([](int){});
}
std::is_invocable_r_v<R, C, Args...>引起歧义,因为任何类型都可以转换为void。
std::is_same_v<R, std::invoke_result_t<C, Args...>>导致替换失败。

最佳答案

问题是,当无法使用C调用Args...时,您的特征不正确,您必须对变量进行SFINAE运算:

template <typename R, typename C, typename TupleArgs, typename Enabler = void>
constexpr bool is_exact_invocable_r_v_impl = false;

template <typename R, typename C, typename... Args>
constexpr bool is_exact_invocable_r_v_impl<R,
C,
std::tuple<Args...>,
std::void_t<std::invoke_result_t<C, Args...>>> =
std::is_same_v<R, std::invoke_result_t<C, Args...>>;

template <typename R, typename C, typename... Args>
constexpr bool is_exact_invocable_r_v =
is_exact_invocable_r_v_impl<R, C, std::tuple<Args...>>;

Demo

关于c++ - 如何专门化模板函数以区分void和non-void函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60993772/

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