小编joh*_*456的帖子

两种模板代码模式之间的差异,一种情况下分配了数字,而另一种情况下使用关键字 typename

在下面的代码中,下面两个模板行有什么区别。

>      1. template<class T, std::enable_if_t<std::is_integral<T>::value, int> = 0> 
>      2. template<class T, typename = std::enable_if_t<std::is_integral<T>::value>>
Run Code Online (Sandbox Code Playgroud)

以上两条线都工作正常,我只是想知道使用其中一条线的优势/劣势。

#include <type_traits>
#include <iostream>
template<class T, std::enable_if_t<std::is_integral<T>::value, int> = 0>

//template<class T, typename = std::enable_if_t<std::is_integral<T>::value>>


int onlyOnInt(T a, T b)
{
    return a+b;
}
int main()
{
    onlyOnInt(1, 2);
}
Run Code Online (Sandbox Code Playgroud)

c++ templates sfinae c++14

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

SFINAE - 如果参数是可复制构造的,则启用一个函数,否则启用另一个函数

如果参数是可复制构造的,我希望调用一个函数和另一个函数(类似于前面的但有额外的代码)。我发现 std::is_copy_constructible 没有按预期工作

#include <iostream>

using namespace std;


struct NoCopy {
    int n;
    NoCopy(const NoCopy&) = delete;
};


template <typename T, 
         typename U, 
         std::enable_if_t<!std::is_copy_constructible_v<U>, int> = 0>
void log_debug(T&& t, U&& u)
{
    
 std::cout<<"\n"<<typeid(U).name()<<" does not have copy constructor; ";  
}
   
   
template <typename T, 
            typename U, 
            std::enable_if_t<std::is_copy_constructible_v<U>, int> = 0>
void log_debug(T&& t, U&& u)
{
    
 std::cout<<"\n"<<typeid(U).name()<<" has copy constructor; ";  
}

int main()
{
    NoCopy a{2};
    log_debug("value is ", a);
    
    std::cout<<"\nstd::is_nothrow_copy_constructible_v  "<<std::is_copy_constructible_v<NoCopy>;  //returns 0 as expected

    return 0;
} …
Run Code Online (Sandbox Code Playgroud)

c++ templates copy-constructor c++17

0
推荐指数
1
解决办法
39
查看次数

标签 统计

c++ ×2

templates ×2

c++14 ×1

c++17 ×1

copy-constructor ×1

sfinae ×1