我有一个结构模板,有两种类型(T
and S
),并在某些时候使用static_cast
从一种类型转换为另一种类型。经常出现这样的情况T
and S
是同一类型。
设置的简化示例:
template <typename T, typename S = T>
struct foo
{
void bar(T val)
{
/* ... */
some_other_function(static_cast<S>(val));
/* ... */
}
};
在这种情况下S
是同一个班级T
, 是否或可以static_cast
引入额外的开销,或者它是一个总是被忽略的空操作?
如果它确实引入了开销,是否有一个简单的模板元编程技巧来执行static_cast
仅在需要时,或者我需要创建部分专业化来应对T == S
案件?我宁愿避免整个的部分专业化foo
如果可能的话,模板。
是的,它可以。
这是一个例子:
struct A {
A( A const& ) {
std::cout << "expensive copy\n";
}
};
template<typename T>
void noop( T const& ) {}
template <typename T, typename S = T>
void bar(T val)
{
noop(static_cast<S>(val));
}
template <typename T>
void bar2(T val)
{
noop(val);
}
int main() {
std::cout << "start\n";
A a;
std::cout << "bar2\n";
bar2(a); // one expensive copy
std::cout << "bar\n";
bar(a); // two expensive copies
std::cout << "done";
}
基本上,一个static_cast
可以诱导调用复制构造函数。
对于某些类型(例如int
),复制构造函数基本上是免费的,编译器可以消除它。
对于其他类型,则不能。在这种情况下,复制省略也不合法:如果您的复制构造函数有副作用,或者编译器无法证明它没有副作用(如果复制构造函数不平凡,则很常见),它将被调用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)