检测 C++ class 是否有模板方法
Detect if C++ class has a template method
我知道如何在 C++ 中检测变量或常规方法的存在 class。但是,当方法是模板时,该怎么做呢?考虑代码:
struct SomeClass
{
template<typename Sender, typename T>
auto& send(T& object) const
{
Sender::send(object);
return object;
};
};
如何编写类似 is_sendable
的内容,以便 is_sendable<SomeClass>::value
(或任何其他语法)returns 为真,因为 SomeClass
具有如上所述的方法 send
?
好的,我成功地解决了它,如果有人感兴趣:
我需要创建一个虚拟对象 class
class DummySender
{
public:
template<typename T>
static void send(const T&)
{}
};
然后我可以通过定义类型特征来检查发送方法是否存在:
template<typename T, typename = void>
struct IsSendable: std::false_type
{};
template<typename T>
struct IsSendable<T, decltype(std::declval<T>().send<DummySender>(std::cout), void())> : std::true_type
{};
终于有IsSendable<SomeClass>::value
.
我知道如何在 C++ 中检测变量或常规方法的存在 class。但是,当方法是模板时,该怎么做呢?考虑代码:
struct SomeClass
{
template<typename Sender, typename T>
auto& send(T& object) const
{
Sender::send(object);
return object;
};
};
如何编写类似 is_sendable
的内容,以便 is_sendable<SomeClass>::value
(或任何其他语法)returns 为真,因为 SomeClass
具有如上所述的方法 send
?
好的,我成功地解决了它,如果有人感兴趣:
我需要创建一个虚拟对象 class
class DummySender
{
public:
template<typename T>
static void send(const T&)
{}
};
然后我可以通过定义类型特征来检查发送方法是否存在:
template<typename T, typename = void>
struct IsSendable: std::false_type
{};
template<typename T>
struct IsSendable<T, decltype(std::declval<T>().send<DummySender>(std::cout), void())> : std::true_type
{};
终于有IsSendable<SomeClass>::value
.