Aar*_*man 1 c++ template-meta-programming c++17
如果一个类有一个具有给定签名的构造函数,我如何编译时检测?具体来说,我想做以下事情:
class Archive
{
// (...)
template <typename T>
T Read()
{
if constexpr(HasUnarchiveConstructor<T>())
{
return T(*this); // constructor accepts reference to Factory
}
else
{
T t;
Unarchive(*this, t); // use stand alone function instead. (if this is not available either, compiling fails)
return t;
}
}
}
Run Code Online (Sandbox Code Playgroud)
有许多用于检测具有特定签名的功能的源.但是我无法将这些转换为构造函数. 源1 源2 源3等等.
从我发现的源代码中我编译了以下内容以检测函数是否具有plus运算符:
template<typename T>
using HasUnarchiveConstructorImpl = decltype(std::declval<T>() + std::declval<T>());
template< typename T >
using HasUnarchiveConstructor = std::is_detected<HasUnarchiveConstructorImpl, T>;
Run Code Online (Sandbox Code Playgroud)
如何将其扩展到我想要执行的检查?或者我怎么能以不同的方式做到这一点?
How*_*ant 10
我会用:
if constexpr(std::is_constructible<T, Archive&>{})
Run Code Online (Sandbox Code Playgroud)
这个特性存在,<type_traits>并为您准备和调试.有一整套特征可以检测到这个问题的变体.
| 归档时间: |
|
| 查看次数: |
504 次 |
| 最近记录: |