使用SFINAE来检测void返回类型函数的存在
Using SFINAE to detect existence of a function of void return type
这是我的位置。我试图检测一个类型是否有nlohmann::json,namleyto_json
使用的特殊方法。现在,我看到了以下使用SFINAE进行免费功能检查的解决方案:
-
通过模板检查c++11中是否存在函数(而不是方法(
-
SFINAE:检测类是否具有自由功能
但这些方法似乎至少依赖于函数的返回类型是否为void。在to_json
的情况下,签名如下:
void to_json(json& j, const T& p);
返回无效。。。从而使这些方法失败(不管怎样,第二种方法都不起作用,因为为每种类型定义自定义包装器根本不可行(。
我修改了第一种方法,不出所料:
#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!
我看到了一种确定函数的返回是否为空的方法,但我不确定如何将其解释为我的问题的解决方案
nlohmann::json有多种方法可以将给定类型转换为json。没有为int
定义to_json
,因此您的类型特征按指定工作。
相反,检测是否可以将类型转换为nlohmann::json
对象:
template <typename T>
using is_jstreamable = std::is_convertible<T, nlohmann::json>;
Godbolt 直播
相关文章:
- C++模板来检查友元函数的存在
- C++quit()函数中可能存在作用域问题
- g++ 说函数不存在,即使包含正确的标头
- C++LinkedList问题.数据类型之间存在冲突?没有匹配的构造函数
- 我知道函数调用中存在歧义.有没有办法调用foo()函数
- 根据某个函数是否存在启用模板
- 在 boost::variant 中类 holden 的复制构造函数存在问题
- 未定义的引用(但 nm 表示该函数存在)
- C++ 默认构造函数在移动和复制构造函数存在时不随"using"继承
- template_back和move赋值构造函数存在问题
- 基于方法或自由函数存在的模板构造函数解析
- 强制非类函数存在
- C++11/14:如果函数存在,则对其进行包装
- 递归函数存在out_of_range异常
- 匹配成员函数存在和签名:参数
- 未解析的外部符号错误,即使函数存在char*
- 在Qt创建者中推广QWidget,构造函数存在问题
- Boost MPL:只在(成员)函数存在时调用它
- 使用类而不是结构和构造函数存在问题
- Async_Read函数存在问题