【问题标题】:How do I force a specific instantiation of a templated function without repeating its signature?如何在不重复其签名的情况下强制对模板化函数进行特定实例化?
【发布时间】:2014-03-25 08:26:00
【问题描述】:

我需要为一些特定的模板参数实例化一个带有长签名的模板函数foo()

我刚刚阅读了this question 的答案,它基本上建议复制函数签名但设置特定参数。我想以某种方式避免这种情况。实现这一目标的合理方法是什么?例如可以让我写的东西

INSTANTIATE(foo, template_arg1, template_arg2);

或许

MyFunctionType<template_arg1, template_arg2> foo;

仅出于说明目的,假设这是foo 的代码:

template<typename T, int val>
unsigned foo(
    T bar,
    SomeType baz1,
    SomeOtherType baz2,
    YetAnotherType you_catch_the_drift) 
{ 
    /* some code here */ 
}

【问题讨论】:

  • @jrok:我认为这不重要,但现在看看我的编辑。
  • 在 C++11 中,您可以使用模板别名为您的函数类型创建一个别名,部分参数化。如果您的函数有太多参数,这会有所帮助,但其中一些是众所周知的(经常使用),而另一些则不是,应该由函数类型的用户指定。
  • 这同样适用于函数的使用,不仅仅是其类型的实例化/声明。您可以使用 std::bind() 绑定众所周知的参数,并减少用户应在调用点指定的参数数量。
  • @Manu343726:你能给出示例代码吗?另外,我可以使返回类型非常冗长乏味,例如std::tuple<:map>, std::vector<:list>>` 什么的。

标签: c++ function templates instantiation code-duplication


【解决方案1】:

在函数模板的显式实例化中,如果可以推导出所有参数,则可以在 template-id 之后省略模板参数列表:

template<typename T> void foo(T) {}
template void foo(int); // explicit instantiation
//               ^ no template parameter list here

但在你的情况下不是,因为val 参数需要显式传递。这就是您的显式实例化的样子:

template unsigned foo<int, 0>(int, char, double, float);

有那么糟糕吗?您可以编写一个宏来避免一些重复,但看起来一开始就没有太多。

【讨论】:

  • 为了清楚起见——如果我写这行——它看起来像是一个专业化的声明——它会实例化模板吗?也就是说,我会在我的 objdump 输出中看到 foo
  • @phresnel 是的,我想我还没有完全清醒 :)
  • @einpoklum 是的,这个功能叫做explicit instantiation
  • @einpoklum 它的语法与专业化的声明有点不同。
  • 这仍然意味着如果我的函数签名发生变化,我需要更改所有这些显式实例化。我不能改用decltype 或类似的东西吗?
【解决方案2】:

您可以简单地定义一个宏:

#define INSTANTIATE_FOO(T, val) \
template \
unsigned foo<T, val>( \
    T bar, \
    SomeType baz1, \
    SomeOtherType baz2, \
    YetAnotherType you_catch_the_drift);

并按以下方式使用:

INSTANTIATE_FOO(int, 0)

【讨论】:

  • 但这仍在重复签名(尽管将重复次数减少到 1)
猜你喜欢
  • 1970-01-01
  • 2011-01-10
  • 2013-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多