根据模板参数不一致执行不同的功能

Mat*_*nti 14 c++ templates sfinae c++11

这绝对是一个微不足道的问题,但我无法弄清楚如何做到这一点.

我有一个模板功能,比方说template <unsigned int N> void my_function().现在,我有两个不同的实现my_function,第一个应该使用,如果N大于,比如100,另一个如果N小于那个.

我试着像这样使用SFINAE:

template <unsigned int N, typename = enable_if <N >= 100> :: type> my_function()
{
   // First implementation
}

template <unsigned int N, typename = enable_if <N < 100> :: type> my_function()
{
   // Second implementation
}
Run Code Online (Sandbox Code Playgroud)

但那是两次声明相同的功能.然后我尝试做类似的事情

template <unsigned int N, bool = (N >= 100)> my_function();
Run Code Online (Sandbox Code Playgroud)

然后用两个不同的布尔值实现这两个函数.没有成功,因为它是部分专业化.

然后我尝试N在函数调用中包装为struct参数和bool,但它在专门化类之前专门化了一个成员函数,这是无法完成的.

有合理的方法吗?

vso*_*tco 12

试试这个:

#include <type_traits>
#include <iostream>

template <unsigned int N, typename std::enable_if <N >= 100> :: type* = nullptr> 
void my_function()
{
    std::cout << "N >= 100" << std::endl;
}

template <unsigned int N, typename std::enable_if <N < 100> :: type* = nullptr> 
void my_function()
{
   std::cout << "N < 100" << std::endl;
}

int main()
{
    my_function<42>();
    my_function<100>();
}
Run Code Online (Sandbox Code Playgroud)

模板默认参数不参与重载(因此SFINAE不适用).另一方面,在上面的代码片段中,依赖模板非类型参数位于赋值的左侧,因此SFINAE启动.


小智 5

如果由于某种原因你不喜欢enable_if,你总是可以去标签发送:

#include <type_traits>
class low {};
class high {};
template <int N, class T>
   void func(T, low)
   {
      // version for high N
   }
template <int N, class T>
   void func(T, high)
   {
      // version for low N
   }
template <int N, class T>
   void func(T val)
   {
      func<N>(val, std::conditional_t<(N>=100), high, low>{});
   }
int main()
{
   func<3>(3.14159); // low version
   func<256>("Yo"); // high version
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我们可以将标签限制为像true_type和false_type这样的简单事物,但通常这可能是一种替代方法.