Q:

Passing a function f to the contructor of a class templated on the type of f

I'm exploring two different ways to pass a function to the ctor of a class template Bar, as shown below and online. 
Compliers tested: GCC 5.4.0 and clang 3.8.0. (The offending constructs are disabled in the online version.)
#include <iostream>
#include <cxxabi.h>

#define DEMANGLE( object )                                                          \
{                                                                                   \
    int status;                                                                     \
    char* name = abi::__cxa_demangle( typeid( object ).name() , 0 , 0 , &status );  \
    if( !status ) std::cout << name << std::endl;                                   \
    delete name;                                                                    \
} 

template<typename T> 
struct Bar;

template<typename ...Args> 
struct Bar<void(Args...)>
{
#if 0
    Bar( void(Args...) )        // OKAY 
    {                           // Question 1: need to assign a name to the function void(Args...)
    }
#else
    Bar( void(Args...) func )   // ERROR
    {
    }
#endif    
};

void wiggle( bool , short , int )
{   
}

template<typename F>
void wrapper( F f )
{
    //DEMANGLE( f )             // optional print out of the type of F
    Bar<F> bar( f ) ;           // Question 2: incomplete type error -- why is specialization of Bar not chosen???
}

int main()
{
    wrapper( wiggle );
    Bar<decltype(wiggle)> f( &wiggle );
}

Question 1
My first attempt to pass the function wiggle to Bar is to directly instantiate the latter as follows Bar<decltype(wiggle)> f( &wiggle ). The problem is how to name/reference the function passed to the constructor Bar::Bar(f). Writing the ctor with an unnamed argument Bar( void(Args...) ) compiles okay, but when I attempt to name or reference the argument passed to the ctor, like so Bar( void(Args...) func ), I get a compiler error
source_file.cpp:23:21: error: expected ')'
        Bar( void(Args...) func )       // ERROR
                           ^
source_file.cpp:23:5: note: to match this '('
        Bar( void(Args...) func )       // ERROR

Question 2
My second attempt to pass the function to Bar uses the function void wrapper( F f ) in order to invoke Bar<F> bar( f ). Oddly both compilers reach for the (unimplemented) base template of Bar instead of the specialization, which generates the error
source_file.cpp:37:9: error: implicit instantiation of undefined template 'Bar<void (*)(bool, short, int)>'
        Bar<F> bar( f );
               ^
source_file.cpp:42:2: note: in instantiation of function template specialization 'wrapper<void (*)(bool, short, int)>' requested here
        wrapper( wiggle );
        ^
source_file.cpp:13:8: note: template is declared here
struct Bar;

What's specially confounding is that type name info dump macro DEMANGLE confirms that the type of F passed to wrapper is void (*)(bool, short, int).

A:

The problem is that wiggle  is implicitly converted to a function pointer when passed to wrapper, so the actual type of F is:
void (*)(bool, short, int)

...which cannot match void(Args). You could use std::remove_pointer_t:
Bar<std::remove_pointer_t<F>> bar( f );

Regarding your first error, Bar(void (Args...) func) is not a correct construct, Bar(void func(Args...)) would be here, but that would be equivalent to:
Bar(void (*func)(Args...))

...which is much clearer (in my opinion).

