如何强制模板化函数的特定实例化而不重复其签名?

时间:2014-03-25 08:26:00

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

对于某些特定的模板参数,我需要使用长签名实例化模板化函数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 */ 
}

2 个答案:

答案 0 :(得分:0)

在函数模板的显式实例化中,如果可以推导出所有参数,则可以在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);

那是不是很糟糕?你可以编写一个宏来避免一些重复,但看起来首先没有太多。

答案 1 :(得分:0)

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

#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)