C++ 使用std::enable_if和constexpr参数进行重载解析不';I don’我没有按预期工作
我试图根据模板参数之一的类型为函数模板添加函数重载,并将定义为consexpr的参数传递到其他地方,以帮助解决重载问题 下面是我试图实现的代码示例: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&
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