【发布时间】:2018-11-23 08:18:42
【问题描述】:
是否可以从模板成员函数中检查一个类是否有某个成员函数重载?
我能找到的最好的类似问题是:Is it possible to write a template to check for a function's existence? 据我了解,这不适用于检查函数重载的情况。
这是一个如何应用的简化示例:
struct A;
struct B;
class C
{
public:
template<typename T>
void doSomething(std::string asdf)
{
T data_structure;
/** some code */
if(OVERLOAD_EXISTS(manipulateStruct, T))
{
manipulateStruct(data_structure);
}
/** some more code */
}
private:
void manipulateStruct(B& b) {/** some different code */};
}
我的问题是,是否存在某种标准方法可以使以下代码的用法起作用:
int main(int argc, const char** argv)
{
C object;
object.doSomething<A>("hello");
object.doSomething<B>("world");
exit(0);
}
我能想到的唯一方法是简单地为结构A 创建一个manipulateStruct 的空重载。否则,操作方法当然也可以放入要操作的结构中,这将使 SFINAE 成为一种选择。让我们假设这两种情况都不存在。
有什么方法可以让与上述类似的代码工作吗?是否存在类似于OVERLOAD_EXISTS 的内容,让编译器知道何时将manipulateStruct 部分添加到生成的代码中?或者是否有一些聪明的方法可以让 SFINAE 为这种情况工作?
【问题讨论】: