gpt4 book ai didi

c++ - 使检查成员函数是否存在以适应函数参数

转载 作者:太空宇宙 更新时间:2023-11-04 12:21:33 31 4
gpt4 key购买 nike

我一直在努力适应this启用普通(非成员)功能的解决方案。在我的例子中,我有很多全局字符串实用类型函数,它们采用任何字符串类型 T,使得 T 具有,比方说,一个 char const* c_str() const。成员函数。

目标是在用户尝试传递某种没有 c_str() 的类型 T 时消除奇怪的编译器错误消息成员函数,即,而不是编译器说“c_str():没有这样的成员函数”,我宁愿编译器说“foo(T&):没有这样的函数”,其中 foo是全局函数。

这里是修改后的代码:

template<bool B,typename T = void>
struct enable_if {
typedef T type;
};

template<typename T>
struct enable_if<false,T> {
};

//
// This macro is adapted from the linked-to question -- this part works fine.
//
#define DECL_HAS_MEM_FN(FN_NAME) \
template<class ClassType,typename MemFnSig> \
struct has_##FN_NAME##_type { \
typedef char yes[1]; \
typedef char no[2]; \
template<typename T,T> struct type_check; \
template<class T> static yes& has( type_check<MemFnSig,&T::FN_NAME>* ); \
template<class T> static no& has( ... ); \
enum { value = sizeof( has<ClassType>(0) ) == sizeof( yes ) }; \
}

// Declare an instance of the above type that checks for "c_str()".
DECL_HAS_MEM_FN(c_str);

// Define another macro just to make life easier.
#define has_c_str(STRINGTYPE) \
has_c_str_type<STRINGTYPE,char const* (STRINGTYPE::*)() const>::value

//
// A "ValidatedStringType" is a StringType that uses the above machinery to ensure that
// StringType has a c_str() member function
//
template<class StringType>
struct ValidatedStringType {
typedef typename enable_if<has_c_str(StringType),StringType>::type type;
};

// Here's the global function where I want to accept only validated StringTypes.
template<class StringType>
void f( typename ValidatedStringType<StringType>::type const& s ) {
}

struct S { // Class for testing that has c_str().
char const* c_str() const {
return 0;
}
};

struct N { // Class for testing that does not have c_str().
};

using namespace std;

int main() {
S s;
N n;
cout << has_c_str(S) << endl; // correctly prints '1'
cout << has_c_str(N) << endl; // correctly prints '0'
f( s ); // error: no matching function for call to 'f(S&)'
}

但是,如上所示,编译器不会“看到”f(S&) -- 为什么不呢?

最佳答案

如果我正确理解了问题,将 enable_if 应用于 f 本身就像以下将解决问题:

template<class StringType>
typename enable_if<has_c_str(StringType),StringType>::type
f( StringType const& s ) {....}

希望这对您有所帮助。

关于c++ - 使检查成员函数是否存在以适应函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4771867/

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