Sunday, 13 May 2018

c++11 - alias for multi parameter function template




I am trying to create a template for a multi-parameter function, and then an alias for a particular instantiation. From this really good post:



C++11: How to alias a function?



I found example code that works for a single function parameter and single template parameter:



#include 
namespace Bar
{

void test()
{
std::cout << "Test\n";
}

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

}

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

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

}


When I try to expand to two function parameters as such:



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


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


I get these errors in Visual Studio:




error C2440: 'initializing' : cannot convert from 'void (__cdecl
*)(const T &,const T &)' to 'void (__cdecl &)(const int &,const int &)'



IntelliSense: a reference of type "void (&)(const int &, const int &)"

(not const-qualified) cannot be initialized with a value of type
""




I thought I followed the pattern exactly in expanding to 2 arguments.
What's the proper syntax for this?


Answer



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


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

int main() {
return 0;
}


The type parameter int needs to be specified only once in noBarTest.


No comments:

Post a Comment

casting - Why wasn&#39;t Tobey Maguire in The Amazing Spider-Man? - Movies &amp; TV

In the Spider-Man franchise, Tobey Maguire is an outstanding performer as a Spider-Man and also reprised his role in the sequels Spider-Man...