#include <iomanip>
#include <iostream>
#include <map>
#include <type_traits>
#include <vector>
// 探测成员
#define DEFINE_HAS_MEMBER(Member) \
template <typename, typename = std::void_t<>> \
struct HasMemberT_##Member \
: std::false_type \
{ \
}; \
template <typename T> \
struct HasMemberT_##Member<T, std::void_t<decltype(&T::Member)>> : std::true_type \
{ \
};
DEFINE_HAS_MEMBER(size);
void Test()
{
std::cout << HasMemberT_size<int>::value << std::endl; // 0
std::cout << HasMemberT_size<std::vector<int>>::value << std::endl; // 1
}
// 萃取类型是否包含成员方法
template <typename, typename = std::void_t<>>
struct IsBeginT : std::false_type
{
};
template <typename T>
struct IsBeginT<T, std::void_t<decltype(std::declval<T>().begin())>> : std::true_type
{
};
void Test1()
{
std::cout << IsBeginT<char>::value << std::endl;
std::cout << IsBeginT<std::vector<int>>::value << std::endl;
}
int main()
{
Test1();
}
探测模板参数
最新推荐文章于 2025-06-12 16:49:52 发布
文章展示了如何使用C++的模板元编程来探测一个类型是否具有特定的成员函数或数据成员。通过定义宏DEFINE_HAS_MEMBER和结构体IsBeginT,检查类型是否含有size成员和begin()方法,并在测试中应用到int和std::vector<int>上。
1万+

被折叠的 条评论
为什么被折叠?



