我有一个可变参数模板函数,我想用来有条件地向另一个可变参数模板函数添加参数。这是一个最小的示例,但是我无法编译它:
// Copyright 2019 Google LLC.
// SPDX-License-Identifier: Apache-2.0
#include <utility>
template<typename... Args>
void f(Args&&... args) {
// does something with args
}
template<typename T, typename... Args>
void g(T&& t, int i, Args&&... args) {
if (i != 0) t(i, std::forward<Args>(args)...);
else t(std::forward<Args>(args)...);
}
int main() {
g(f, 0, 0);
return 0;
}
上面代码的clang输出是:
main.cpp:15:7: error: no matching function for call
to 'g'
g(f, 0, 0);
^
main.cpp:9:10: note: candidate template ignored:
couldn't infer template argument 'T'
void g(T&& t, int i, Args&&... args) {
^
1 error generated.
使用宏,它将像这样工作(如果我将g
上面的函数替换为该宏,则会进行编译):
// Copyright 2019 Google LLC.
// SPDX-License-Identifier: Apache-2.0
#define g(t, i, args...) \
if((i) != 0) (t)((i), args); \
else (t)(args);
有没有一种方法可以使我的工作不使用宏?
直接传递f
不起作用,因为函数指针必须指向必须在g
调用点实例化的特定函数模板实例。使用模板模板模板参数,可以创建可以作为参数传递而无需事先实例化的函数签名生成器:
#include <utility>
template<typename... Args>
void f(Args... args) {
// does something with args
}
template<typename... Args> struct
get_f
{
static constexpr auto & get() { return f<Args...>; }
};
template<template<typename...> typename T, typename... Args>
void g(int i, Args&&... args) {
if (i != 0) T<int, Args...>::get()(i, std::forward<Args>(args)...);
else T<Args...>::get()(std::forward<Args>(args)...);
}
int main() {
g<get_f>(0, 0);
return 0;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句