gpt4 book ai didi

c++ - 使用 SFINAE 检测是否存在返回类型为 void 的函数

转载 作者:行者123 更新时间:2023-11-30 03:21:56 25 4
gpt4 key购买 nike

这是我的情况。我正在尝试检测一个类型是否具有 nlohmann::json 使用的特殊方法, namley to_json。现在我看到了以下使用 SFINAE 进行免费功能检查的解决方案:

但这些方法至少看起来依赖于函数的返回类型是否为空。在 to_json 的情况下,签名如下:

void to_json(json& j, const T& p);

返回 void... 从而使这些方法失败(第二个方法实际上不起作用,因为为每种类型定义自定义包装器根本不可行)。

我修改了第一个方法,和预期的一样:

#include <iostream>
#include <type_traits>
#include "json.hpp"

template<class...> struct voider { using type = void; };
template<class... T> using void_t = typename voider<T...>::type;

template<class T, class = void>
struct is_jstreamable : std::false_type{};

template<class T>
struct is_jstreamable<T, void_t<decltype(to_json(std::declval<nlohmann::json &>(),
std::declval<T>()))>> : std::true_type {};

struct Foo;

template<typename T>
typename std::enable_if<is_jstreamable<T>::value,
void>::type
bar(){
std::cout << "It works!" << std::endl;
};

template<typename T>
typename std::enable_if<!is_jstreamable<T>::value,
void>::type
bar(){
std::cout << "It doesn't work!" << std::endl;
}

int main(){
//int does have conversion
bar<int>();
//foo does not have conversion
bar<Foo>();
}

它无法工作,因为它是 void 类型,控制台返回:

It doesn't work!
It doesn't work!

而不是预期的

It works!
It doesn't work!

我看到了 determining if the return of a function is void 的方法但我不确定如何将其纳入我的问题的解决方案

最佳答案

nlohmann::json 有多种方法可以将给定类型转换为 json。没有为 int 定义 to_json,因此您的类型特征按指定方式工作。

相反,检测您是否可以将类型转换为 nlohmann::json 对象:

template <typename T>
using is_jstreamable = std::is_convertible<T, nlohmann::json>;

Live on Godbolt

关于c++ - 使用 SFINAE 检测是否存在返回类型为 void 的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51661428/

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