【发布时间】:2015-05-19 02:12:13
【问题描述】:
我想创建一个模板,该模板调用另一个对象的成员函数,该对象返回与成员函数相同的类型。在成员函数上使用 decltype 的语法有点难看,但它似乎在除一种情况外的所有情况下都有效。
来电:
struct container: map<string, C>
{
template< typename MemFnPtrType, typename... _ArgTypes>
auto safeOperation(string key, MemFnPtrType mfp, _ArgTypes&&... args )
-> decltype( (((C*)nullptr)->*mfp)(args...))
{
C* pC = NULL;
decltype((pC->*mfp)(args...)) result;
iterator it = find(key);
if (it != end())
{
C* pC = &(it->second);
result = (pC->*mfp)(args...);
cout << "result:" << result << "\n";
}
else
{
cout << "key: " << key << " missing\n";
}
return result;
}
};
在成员函数返回 void 之前,这可以正常工作。
有没有办法检测到这一点并忽略违规行?
我显然可以创建一个 voidSafeOperation 函数。我不介意创建另一个模板,但我想使用相同的名称“safeOperation”,这样调用站点就不需要根据成员函数的返回类型使用不同的帮助器。
谢谢!
完整示例: http://cpp.sh/7ft
【问题讨论】: