2013-03-27 5 views
18

Angenommen, ich habe eine template Funktion zu übergeben:Wie eine Template-Funktion in einer Vorlage Argumentliste

template<typename T> 
T produce_5_function() { return T(5); } 

Wie kann ich diese ganzen template an einem anderen template passieren?

Wenn produce_5_function ein Funktor, gäbe es kein Problem sein:

template<typename T> 
struct produce_5_functor { 
    T operator()() const { return T(5); } 
}; 
template<template<typename T>class F> 
struct client_template { 
    int operator()() const { return F<int>()(); } 
}; 
int five = client_template<produce_5_functor>()(); 

aber ich möchte in der Lage sein, dies mit einer rohen Funktionsschablone zu tun:

template<??? F> 
struct client_template { 
    int operator()() const { return F<int>(); } 
}; 
int five = client_template<produce_5_function>()(); 

Ich vermute, die Antwort ist, "du kannst das nicht machen".

Antwort

12

Ich vermute, die Antwort ist "Sie können das nicht tun".

Ja, das ist der Fall, Sie können eine Funktionsvorlage nicht als Vorlagenargument übergeben. Von 14.3.3:

Ein Template-Argument für eine Template-Template-Parameter ist der Name einer Klasse-Vorlage oder eines Pseudonyms gestattet Vorlage sein, ausgedrückt als id-Ausdruck.

Die Template-Funktion benötigt werden instanziiert vor Sie es auf die andere Vorlage übergeben. Eine mögliche Lösung ist eine Klasse Typ übergeben, die eine statische produce_5_function wie so gilt:

template<typename T> 
struct Workaround { 
    static T produce_5_functor() { return T(5); } 
}; 
template<template<typename>class F> 
struct client_template { 
    int operator()() const { return F<int>::produce_5_functor(); } 
}; 
int five = client_template<Workaround>()(); 

Mit Alias-Vorlagen, konnte ich ein wenig näher kommen:

template <typename T> 
T produce_5_functor() { return T(5); } 

template <typename R> 
using prod_func = R(); 

template<template<typename>class F> 
struct client_template { 
    int operator()(F<int> f) const { return f(); } 
}; 

int five = client_template<prod_func>()(produce_5_functor); 
+0

Gibt es ein wesentlicher Grund, warum Template-Template-Parameter können keine Funktionsvorlagen sein? Wird dies in Zukunft wahrscheinlich angegangen werden? – Olumide

+0

@Olumide: Wahrscheinlich, weil es eine Menge zusätzliche Komplexität und einfach zu umgehen ist (siehe Mfontanini's Antwort). Gleiches gilt für die teilweise Spezialisierung, die viel mehr als Template-Template-Argumente verwendet wird. –

2

Wie wäre es mit dieser Funktion?

template<typename T> 
struct produce_5_function_wrapper { 
    T operator()() const { return produce_5_function<T>(); } 
}; 

Dann Sie den Wrapper anstelle der Funktion verwenden können: allein

int five = client_template<produce_5_function_wrapper>()(); 

Mit der Template-Funktion wird nicht funktionieren, gibt es nicht so etwas wie „Template-Template-Funktionen“.

Verwandte Themen