我有一个带有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;
}
答案 0 :(得分:4)
编译器是否实际生成不同的代码(或者首先是任何单独的代码)将取决于您对这些函数的处理方式。例如,如果您只是调用该函数并且它相当小,则编译器可能完全内联代码,使其可能小于它首先创建函数时的代码。
另一方面,如果你获取不同实例的地址,它们将具有不同的地址,即,即使编译器可能共享大部分相同的代码,如果类型也需要具有不同的地址是相同的。我不确定你是否可以比较不同类型的函数指针(我们的函数将有一个不同的类型作为参数Bar<A, B, C>
更改)。
请注意,尽管f()
可能无法直接触及任何类型A
,B
或C
,但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);