gpt4 book ai didi

C++11 - 模板 std::enable_if 和 std::result_of

转载 作者:行者123 更新时间:2023-11-27 23:59:42 25 4
gpt4 key购买 nike

我已经创建了这个专门用于 void/non-void 方法的模板

template <typename ClassType, 
typename MethodType, MethodType MethodName,
typename std::enable_if <std::is_same<void, std::result_of<decltype(MethodName)(ClassType)>::type>::value> ::type* = nullptr
>
static int function()
{
//void
//....
}



template <typename ClassType,
typename MethodType, MethodType MethodName,
typename std::enable_if <!std::is_same<void, std::result_of<decltype(MethodName)(ClassType)>::type>::value> ::type* = nullptr
>
static int function()
{
//non-void
//....
}

//And I want to call it like this
function<Foo, void (Foo::*)(void), &Foo::Print>();
function<Foo, int (Foo::*)(void), &Foo::Print2>();

(基于这个答案:C++ template parameter as function call name)

然而,这给了我一堆错误(MSVC 2015)。如果我在

template <typename ClassType, 
typename MethodType, MethodType MethodName
>
static int print()
{
std::cout << "C: " << std::is_same<void, std::result_of<decltype(MethodName)(ClassType)>::type>::value << std::endl;
}

我得到了 true 结果。

是否可以为 MethodName 的 void/non-void 结果专门“创建”函数?

最佳答案

这在 GCC 下编译得很好

#include <iostream>
#include <type_traits>
using namespace std;

template <typename ClassType, typename MethodType, MethodType MethodName>
static auto function()
-> std::enable_if_t<std::is_void<typename std::result_of<MethodType(ClassType)>::type>::value, int>
{
//void
//....
}

template <typename ClassType, typename MethodType, MethodType MethodName>
static auto function()
-> std::enable_if_t<!std::is_void<typename std::result_of<MethodType(ClassType)>::type>::value, int>
{
//non-void
//....
}

我不确定这是否是您正在寻找的,但我使用箭头语法将 enable_if 移动到返回类型,这对我来说看起来更干净。另外,为什么还要在 MethodName 上使用 decltype,因为您已经拥有作为 MethodType 的类型。 result_of 在访问类型之前也需要 typename。

虽然没有可能使用,但确实可以编译,我不确定这是否是您所追求的。

注:std::enable_if_t如果您不能使用对 typename std::enable_if<...>::type 的更改,则在 C++14 中可用相反。

关于C++11 - 模板 std::enable_if 和 std::result_of,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40082173/

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