Попробуйте вместо этого:
#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) не может быть использован для получения указателя на функцию-член для вставки, который может быть преобразован в данную сигнатуру, он не сможет заменить фиктивный параметр и, таким образом, вернуться к версия с многоточием.