【发布时间】:2018-01-20 01:30:58
【问题描述】:
考虑以下情况:我有
int bar1();
double bar2();
我想要:
foo<bar1>(); // calls bar1, then uses its result.
foo<bar2>(); // calls bar2, then uses its result.
编写模板foo()的简单方法是使用附加参数:
template <typename T, T (*f)()> void foo () {
// call f, do something with result
}
这行得通,但我需要做丑陋的语法:
foo<decltype(bar1()), bar1>(); // calls bar1, then uses its result
我想写一些漂亮的东西,就像上面一样,只是foo<bar1>。
附:请不要建议在运行时接受参数。我只需要使用函数指针进行编译时参数化。
附:抱歉忘了提:我正在寻找 C++14 解决方案。 C++17 受到赞赏,我对 C++17 解决方案的答案表示赞同,但项目现在使用 C++14 构建,我无法在最近的将来更改它。
【问题讨论】:
-
你能解释一下为什么它需要是一个模板参数吗?如果你在编译时需要它,将
foo设为constexpr怎么样? -
@VaughnCato 如果您将
bar1作为函数指针传递给foo,并且foo调用bar1,则该调用几乎肯定不会被内联,除非foo的整体是内联。您可能会发现这令人惊讶,正如我与之交谈过的许多 C++ 专家所期望的那样。但我已经用std::sort做了十几次这个实验;比较将函数指针与 lambda 传递到sort(太大而无法内联)。 -
@VaughnCato 您的示例不正确,因为它假设
foo也被内联。 godbolt.org/g/NTi3oF. -
@VaughnCato 不正确的意思是您说“在实践中它不应该是间接调用”,并使用该示例来支持它。
foo不被内联是练习的一部分,所以你的例子不能支持你所说的。绝对没有理由认为这是一个 XY 问题,请不要过度使用它,因为这对提问者来说非常令人沮丧。 -
@VaughnCato,我认为,OP 表现出足够的熟练程度来假设它不是 XY 问题。把一切都归咎于 XY 问题会适得其反。
标签: c++ templates c++14 decltype