我的代码看起来像
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&lt; output&gt;()或invoke(output)。有没有办法定义调用以使其有效?
(输出和调用都比较复杂 - 这是一个用于询问问题的简化版本。不,涉及在调用invoke时知道int的解决方案没有帮助。)
答案 0 :(得分: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