C++ 确定类型是否具有特定的成员函数签名 模板结构检查签名{ 枚举{SizeTrue=1,SizeFalse=2}; typedef char ReturnTrue[SizeTrue]; typedef char ReturnFalse[sizevalse]; typedef typename U::iterator(U::*InsertSig)(typename U::iterator,typename const U::value_type&); 静态ReturnTrue和CheckInsert(InsertSig); 静态返回FALSE和CheckInsert(…); 静态常量布尔值=(sizeof(CheckInsert(&U::insert))==sizeof(ReturnTrue)); }; int main(){ CheckSignature::value;//编译错误 CheckSignature::value;//确定 返回0; }

C++ 确定类型是否具有特定的成员函数签名 模板结构检查签名{ 枚举{SizeTrue=1,SizeFalse=2}; typedef char ReturnTrue[SizeTrue]; typedef char ReturnFalse[sizevalse]; typedef typename U::iterator(U::*InsertSig)(typename U::iterator,typename const U::value_type&); 静态ReturnTrue和CheckInsert(InsertSig); 静态返回FALSE和CheckInsert(…); 静态常量布尔值=(sizeof(CheckInsert(&U::insert))==sizeof(ReturnTrue)); }; int main(){ CheckSignature::value;//编译错误 CheckSignature::value;//确定 返回0; },c++,templates,visual-c++,stl,C++,Templates,Visual C++,Stl,这段代码为string类生成一个编译错误,表示这两个重载都不能转换所有参数类型。然而,对于向量,它编译得很好。当参数不是InsertSig类型时,是否应该选择CheckInsert(…) template<typename U> struct CheckSignature { enum {SizeTrue = 1, SizeFalse = 2}; typedef char ReturnTrue[SizeTrue]; typedef char ReturnFal

这段代码为string类生成一个编译错误,表示这两个重载都不能转换所有参数类型。然而,对于向量,它编译得很好。当参数不是InsertSig类型时,是否应该选择CheckInsert(…)

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;
}
#包括
#包括
#包括
模板结构检查签名{
枚举{SizeTrue=1,SizeFalse=2};
typedef char ReturnTrue[SizeTrue];
typedef char ReturnFalse[sizevalse];
typedef typename U::iterator(U::*InsertSig)(typename U::iterator,typename U::value_type const&);
模板结构伪_类型{};
模板
静态ReturnTrue和CheckInsert(T*,dummy_type dummy=dummy_type());
静态返回FALSE和CheckInsert(…);
静态常量布尔值=(sizeof(CheckInsert((U*)0))==sizeof(ReturnTrue));
};
int main(){
if(CheckSignature::value){

std::coutstd::string::insert
不接受
const char&
参数,只接受
char


此外,根据实现在C++11支持方面取得的进展,所有容器都可能使用const_迭代器(而不是迭代器)指示位置。

您得到了什么编译错误?@Tim error C2665:“CheckSignature::CheckInsert”:这两个重载都不能转换所有参数类型您的
InsertSig
?它是指向成员函数的以下指针:
typedef typename U::iterator(U:*InsertSig)(typename U::iterator,typename const U::value\U type&)
为我编译,但
::value
总是错误的。啊,在VisualStudio中,vector::insert签名使用
常量迭代器
——而不是
迭代器
。一旦我更改了
InsertSig
类型定义,它对我有效。啊,我没有意识到insert()的各种重载带来了歧义函数,而不是CheckInsert()。谢谢!我注意到map和set会失败。这似乎与这些成员函数是继承的这一事实有关。有办法解决这个问题吗?是的,这是一个典型的问题。boost邮件列表中对此进行了讨论:
#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;
}