【发布时间】:2021-11-18 08:02:44
【问题描述】:
我使用std::experimental::is_detected 来确定类是否具有某些成员函数:
#include <utility>
#include <experimental/type_traits>
template<typename USC>
class Descriptor
{
private:
template<class T>
using has_member1_t =
decltype(std::declval<T>().member1(std::declval<std::vector<char> &>()));
public:
static constexpr bool has_member1 =
std::experimental::is_detected_convertible_v<long long,
has_member1_t,
USC>;
};
问题是我还需要确定类是否具有某些具有以下签名的模板成员函数:
template<typename Derived>
int member2(Eigen::ArrayBase<Derived> &&)
我试过这样做:
//Inside Descriptor
template<class T, class U>
using has_member2_t =
decltype(std::declval<T>().member2(std::declval<Eigen::ArrayBase<U> &&>()));
static constexpr bool has_member2 =
std::experimental::is_detected_convertible_v<long long,
has_member2_t,
USC>;
但它不起作用。由于我对 C++ TMP 并没有真正的经验,所以我想知道有没有办法使用 std::experimental::is_detected 或其他一些实用程序来实现这一点?
【问题讨论】:
-
c++20可以吗?这种代码在概念上是相当琐碎的。
-
@super 还可以,但有点不可取。
-
添加了两种方法的示例。
-
@super 谢谢!
标签: c++ template-meta-programming