gpt4 book ai didi

c++ - 如何处理 void decltype();

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:18:30 30 4
gpt4 key购买 nike

我想创建一个模板来调用另一个对象的成员函数,该对象返回与成员函数相同的类型。在成员函数上使用 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

最佳答案

不幸的是,我认为您必须在返回类型上使用 SFINAE 而被困在这里。从类型特征开始(这比您的 decltype 表达式更清晰方式)

template <typename MF, typename... Args>
using Res = typename std::result_of<MF(C, Args...)>::type;

然后切换:

template <typename MF, typename... Args>
typename std::enable_if<
std::is_same<Res<MF, Args...>, void>::value
>::type safeOperation(string key, MF mfp, Args... args)
{
/* void case */
}

template <typename MF, typename... Args>
typename std::enable_if<
!std::is_same<Res<MF, Args...>, void>::value,
Res<MF, Args...>
>::type safeOperation(string key, MF mfp, Args... args)
{
/* non-void case */
}

或者您可以在 is_void 上标记 dispatch:

template <typename MF, typename... Args>
Res<MF, Args...> safeOperation(string key, MF mfp, Args... args)
{
return safeOperation(std::is_void<Res<MF, Args...>>{},
key, mfp, args...);
}

与:

template <typename MF, typename... Args>
void safeOperation(std::true_type /* void */,
string key, MF mfp, Args... args)
{ .. }

template <typename MF, typename... Args>
Res<MF, Args...> safeOperation(std::false_type /* non-void */,
string key, MF mfp, Args... args)
{ .. }

关于c++ - 如何处理 void decltype();,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30315649/

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