多参数函数模板的别名

时间:2016-05-30 16:37:58

标签: templates c++11 alias

我正在尝试为多参数函数创建模板,然后为特定实例化创建别名。从这个非常好的帖子:

C++11: How to alias a function?

我找到了适用于单个函数参数和单个模板参数的示例代码:

#include <iostream>
namespace Bar
{
   void test()
   {
      std::cout << "Test\n";
   }

   template<typename T>
   void test2(T const& a)
   {
      std::cout << "Test: " << a << std::endl;
   }
}

void (&alias)()        = Bar::test;
void (&a2)(int const&) = Bar::test2<int>;

int main()
{
    Bar::test();
    alias();
    a2(3);
}

当我尝试扩展到两个函数参数时:

void noBarTest(T const& a, T const& b)
{
    std::cout << "noBarTest: " << a << std::endl;
}

void(&hh)(int const&, int const&) = noBarTest<int, int>;

我在Visual Studio中遇到这些错误:

  

错误C2440:'初始化':无法转换为'void(__ cdecl   *)(const T&amp;,const T&amp;)'to'void(__ cdecl&amp;)(const int&amp;,const int&amp;)'

     

IntelliSense:类型为“void(&amp;)(const int&amp;,const int&amp;)”的引用“   (不是const限定的)不能使用type值初始化   “”

我以为我完全按照这个模式扩展到2个参数 这个的正确语法是什么?

1 个答案:

答案 0 :(得分:1)

template <typename T>
void noBarTest(T const& a, T const& b)
{
}

void(&hh)(int const&, int const&) = noBarTest<int>; // Only once

int main() {
  return 0;
}

类型参数int只需在noBarTest<int>中指定一次。