相关疑难解决方法(0)

SFINAE在类型和非类型模板参数的情况下工作方式不同

为什么这段代码有效:

template<
    typename T, 
    std::enable_if_t<std::is_same<T, int>::value, T>* = nullptr>
void Add(T) {}

template<
    typename T, 
    std::enable_if_t<!std::is_same<T, int>::value, T>* = nullptr>
void Add(T) {}
Run Code Online (Sandbox Code Playgroud)

并且可以正确区分这两个调用:

Add(1);
Add(1.0);
Run Code Online (Sandbox Code Playgroud)

而以下代码如果编译导致重新定义Add()错误?

template<
    typename T, 
    typename = typename std::enable_if<std::is_same<T, int>::value, T>::type>
void Add(T) {}

template<
    typename T, 
    typename = typename std::enable_if<!std::is_same<T, int>::value, T>::type>
void Add(T) {}
Run Code Online (Sandbox Code Playgroud)

所以如果模板参数是类型,那么我们就重新定义了函数,如果它是非类型的,那么一切都好.

c++ templates overloading sfinae c++11

20
推荐指数
2
解决办法
1194
查看次数

如何初始化div_t对象?

因此,从div函数返回的成员的顺序似乎是实现定义的.

quot1 成员或者是rem

让我们说我做的是这样的:

generate(begin(digits), end(digits), [i = div_t{ quot, 0 }]() mutable {
    i = div(i.quot, 10);
    return i.rem;
})
Run Code Online (Sandbox Code Playgroud)

当然这里的问题是我不知道我是初始化i.quot还是i.rem在我的lambda捕获中.是否i采用div(quot, 1)唯一的跨平台方式来实现这一目标?

c++ member division modulo

3
推荐指数
2
解决办法
369
查看次数

标签 统计

c++ ×2

c++11 ×1

division ×1

member ×1

modulo ×1

overloading ×1

sfinae ×1

templates ×1