2013-04-02 2 views
2

У меня есть код, который выглядит какшаблонные функции в качестве параметра

template<typename C> 
void invoke() { 
    if (thing_known_at_runtime) { 
    C::template run<int>(4); 
    } else { 
    C::template run<char>('a'); 
    } 
} 

struct output { 
    template<typename T> 
    static void run(T x) { 
    cout << x; 
    } 
}; 

invoke<output>(); 

И это работает.

Но мне не нравится определение веса в тяжелом весе. Я хотел бы, чтобы иметь возможность написать:

template<typename T> 
void output(T x) { 
    cout << x; 
} 

И затем вызвать либо вызвать < выход>() или вызова (выход). Есть ли способ определить invoke, чтобы это сработало?

(оба вывода и вызов более сложным - это упрощенная версия для задавая вопрос с Нет, решения, которые вовлекают знавшие Int, когда я называю Invoke не полезны.).

+2

Разрешена C++ 11? И правильно ли я понимаю, что вы просто хотите вызвать функцию с сохраненными аргументами? – chris

+0

Как мне помочь std :: function? Да, разрешен C++ 11. Я хочу вызвать функцию с сохраненными (фактически вычисленными) аргументами * и параметрами шаблона *. Фактически, позвольте мне изменить пример, чтобы сделать это понятным. – dspeyer

+0

Вы не хотите определять две версии 'invoke()'? – jxh

ответ

0

Вы не можете сделать такую ​​вещь , Вы должны знать, что вы хотите сделать, ПЕРЕД вызовом invoke. Что-то, как это будет работать хорошо

void invoke(const std::function<void()>& func) 
{ 
    func(); 
} 

template<typename T> 
void output (const T& val) 
{ 
    std::cout << val << std::endl; 
} 

if (rand() % 2) 
{ 
    invoke(std::bind<void(&)(const int&)>(&output, globals::value_calculated)); 
} 
else 
{ 
    invoke(std::bind<void(&)(const char&)>(&output, globals::value)); 
} 

Полный пример на LWS: http://liveworkspace.org/code/1uLIr4 $ 0

Смежные вопросы