小编art*_*sse的帖子

类和函数的模板参数推导之间的区别

问题是什么:

我正在尝试实现一个具有两种专业化的类,一种用于整数类型,一种用于所有其他类型。我想到的第一个版本:


#include <type_traits>
template<typename T, typename std::enable_if_t<std::is_integral<T>::value, bool> = true>
class Test
{
};
template<typename T, typename std::enable_if_t<!std::is_integral<T>::value, bool> = true>
class Test
{
};

Run Code Online (Sandbox Code Playgroud)

但是当我尝试编译上面的代码时,GCC 失败并出现以下错误:


<source>:2:84: error: template parameter 'typename std::enable_if<std::is_integral<_Tp>::value, bool>::type <anonymous>'
template<typename T, typename std::enable_if_t<std::is_integral<T>::value, bool> = true>
                                                                                   ^~~~
<source>:6:85: note: redeclared here as 'typename std::enable_if<(! std::is_integral<_Tp>::value), bool>::type <anonymous>' 
template<typename T, typename std::enable_if_t<!std::is_integral<T>::value, bool> = true>
                                                                                    ^~~~
Run Code Online (Sandbox Code Playgroud)

但是,对函数使用类似的技术进行编译不会出现问题:


#include <type_traits>
template<typename T, typename std::enable_if_t<std::is_integral<T>::value, bool> = true>
void test()
{
}
template<typename …
Run Code Online (Sandbox Code Playgroud)

c++ templates

5
推荐指数
1
解决办法
134
查看次数

为什么 std::swap 不交换 std::reference_wrapper 的底层对象?

背景:

我正在尝试实现一个函数,我们称之为它mysort,它接受可变数量的相同类型的参数并对它们进行排序。例如下面的代码应该打印1 2 3

template <typename ... Args>
void mysort(Args& ... args);
int main(int, char**)
{
    int x = 3;
    int y = 1;
    int z = 2;
    mysort(x, y, z);
    cout << x << ' ' << y << ' ' << z << endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我尝试过的:

这是我想出的解决方案

#include <array>
#include <algorithm>
#include <functional>

template <typename T, typename ... Args>
void mysort(T& t, Args& ... args)
{
    constexpr size_t n = sizeof...(Args) + 1; …
Run Code Online (Sandbox Code Playgroud)

c++

4
推荐指数
1
解决办法
181
查看次数

标签 统计

c++ ×2

templates ×1