Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用std::enable_if和constexpr参数进行重载解析不';I don’我没有按预期工作_C++_Templates_C++17_Enable If - Fatal编程技术网

C++ 使用std::enable_if和constexpr参数进行重载解析不';I don’我没有按预期工作

C++ 使用std::enable_if和constexpr参数进行重载解析不';I don’我没有按预期工作,c++,templates,c++17,enable-if,C++,Templates,C++17,Enable If,我试图根据模板参数之一的类型为函数模板添加函数重载,并将定义为consexpr的参数传递到其他地方,以帮助解决重载问题 下面是我试图实现的代码示例: struct use_my_impl_t {}; constexpr use_my_impl_t use_my_impl; template< typename T, typename std::enable_if<std::is_same<T, use_my_impl_t>::value&

我试图根据模板参数之一的类型为函数模板添加函数重载,并将定义为consexpr的参数传递到其他地方,以帮助解决重载问题

下面是我试图实现的代码示例:

struct use_my_impl_t {};
constexpr use_my_impl_t use_my_impl;

template<
        typename T,
        typename std::enable_if<std::is_same<T, use_my_impl_t>::value>::type * = nullptr>
void foo(int i, T&& t)
{
    std::cout << "Using my impl: " << --i << std::endl;
}

template<
    typename T,
    typename std::enable_if<!std::is_same<T, use_my_impl_t>::value>::type * = nullptr>
    void foo(int i, T&& t)
{
    std::cout << "Using default impl: " << ++i << std::endl;
}
它打印

Using my impl: 41
Using default impl: 43
Using default impl: 43

为什么最后一条语句不调用我的实现,尽管传递了
use\u my\u impl\t
的实例?

这里的问题是
t
被推断为什么。在
foo(42,使用我的impl{})
use\u my\u impl\u t{code>是一个右值,因此
t
被推断为
use\u my\u impl\u t
,参数变为
use\u my\u impl\t&

使用
foo(42,使用我的impl)
use\u my\u impl
是左值。这意味着
T
被推断为
use\u my\u impl\u T&
来保持左值。这意味着参数变为
use\u my\u impl\u&&&&
use\u my\u impl\u&

这就是导致
std::is\u same::value
不起作用的原因,因为
use\u my\u impl\t&
use\u my\u impl\t
不同。要解决此问题,可以使用
std::decation\t
删除类型的引用和cv限定。那会给你

template<
    typename T,
    typename std::enable_if<std::is_same<std::decay_t<T>, use_my_impl_t>::value>::type * = nullptr>
void foo(int i, T&& t)
{
    std::cout << "Using my impl: " << --i << std::endl;
}

template<
    typename T,
    typename std::enable_if<!std::is_same<std::decay_t<T>, use_my_impl_t>::value>::type * = nullptr>
    void foo(int i, T&& t)
{
    std::cout << "Using default impl: " << ++i << std::endl;
}
使用您的驱动程序代码

template<
    typename T,
    typename std::enable_if<std::is_same<std::decay_t<T>, use_my_impl_t>::value>::type * = nullptr>
void foo(int i, T&& t)
{
    std::cout << "Using my impl: " << --i << std::endl;
}

template<
    typename T,
    typename std::enable_if<!std::is_same<std::decay_t<T>, use_my_impl_t>::value>::type * = nullptr>
    void foo(int i, T&& t)
{
    std::cout << "Using default impl: " << ++i << std::endl;
}
Using my impl: 41
Using default impl: 43
Using my impl: 41