超出代码膨胀的函数不使用模板参数?

时间:2014-12-27 01:06:40

标签: c++ function templates parameters

我有一个带有Bar类型参数的函数f,它有3个模板参数。 f不使用这三个参数中的任何一个。问题:编译器是否仍然根据所有使用的A,B和C组合生成f的多个版本,或者有更好的方法吗?

示例:

template<typename A, typename B, typename C>
class Bar;

template<typename A, typename B, typename C>
void f(Bar<A,B,C>& bar)
{
  //code that does not use A, B or C, e.g.:
  std::cout << bar.some_getter() << std::endl;
}

2 个答案:

答案 0 :(得分:4)

编译器是否实际生成不同的代码(或者首先是任何单独的代码)将取决于您对这些函数的处理方式。例如,如果您只是调用该函数并且它相当小,则编译器可能完全内联代码,使其可能小于它首先创建函数时的代码。

另一方面,如果你获取不同实例的地址,它们将具有不同的地址,即,即使编译器可能共享大部分相同的代码,如果类型也需要具有不同的地址是相同的。我不确定你是否可以比较不同类型的函数指针(我们的函数将有一个不同的类型作为参数Bar<A, B, C>更改)。

请注意,尽管f()可能无法直接触及任何类型ABC,但Bar之间可能存在差异实例化可能导致完全需要不同的代码,显然是生成的。

答案 1 :(得分:2)

编译器将生成您最终使用的重载次数 - 如果您的代码最终为f<A,B,C>的{​​{1}}组合调用n,您将拥有(A,B,C)产生过载。没有不必要的臃肿。但是,模板参数推断发生在确切类型上。例如,您可以只有一个函数

n

让这两个陈述都有效

void foo(double x);

但是,如果你有

foo(1);//int implicitly promoted to double
foo(1.0);

你最终会产生两次重载。

template <typename T>
foo(T x);