gpt4 book ai didi

c++ - 确定类型是否具有特定的成员函数签名

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:58:45 24 4
gpt4 key购买 nike

template<typename U> struct CheckSignature {
enum {SizeTrue = 1, SizeFalse = 2};
typedef char ReturnTrue[SizeTrue];
typedef char ReturnFalse[SizeFalse];
typedef typename U::iterator (U::*InsertSig)(typename U::iterator, typename const U::value_type &);
static ReturnTrue &CheckInsert(InsertSig);
static ReturnFalse &CheckInsert(...);
static const bool value = (sizeof(CheckInsert(&U::insert)) == sizeof(ReturnTrue));
};

int main() {
CheckSignature<std::string >::value; //compile error
CheckSignature<std::vector<int> >::value; // OK
return 0;
}

此代码为字符串类生成一个编译错误,表明 2 个重载中没有一个可以转换所有参数类型。但是,对于 vector ,它编译得很好。只要参数不是 InsertSig 类型,重载解析不应该选择 CheckInsert(...) 吗?

最佳答案

试试这个:

#include <string>
#include <vector>
#include <iostream>

template<typename U> struct CheckSignature {
enum {SizeTrue = 1, SizeFalse = 2};
typedef char ReturnTrue[SizeTrue];
typedef char ReturnFalse[SizeFalse];
typedef typename U::iterator (U::*InsertSig)(typename U::iterator, typename U::value_type const &);
template <InsertSig f> struct dummy_type { };
template <typename T>
static ReturnTrue &CheckInsert(T*, dummy_type<&T::insert> dummy = dummy_type<&T::insert>());
static ReturnFalse &CheckInsert(...);
static const bool value = (sizeof(CheckInsert(((U*)0))) == sizeof(ReturnTrue));
};

int main() {
if(CheckSignature<std::string >::value) {
std::cout << "String class has proper insert function" << std::endl;
}; //OK, does not print, as expected.
if(CheckSignature<std::vector<int> >::value) {
std::cout << "Vector class has proper insert function" << std::endl;
}; //OK, does print, as expected.
return 0;
}

它不起作用的原因是,在您的版本中,获取插入函数的地址将在调用位置失败,而不是在替换位置(这不是错误)。上面将确保如果类型 U(模板化为 T)不能用于获取可转换为给定签名的要插入的成员函数指针,它将无法替代虚拟参数,因此,恢复为省略号版本。

关于c++ - 确定类型是否具有特定的成员函数签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5748117/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com