【发布时间】:2014-05-08 05:01:47
【问题描述】:
给定类模板
template<class T>
struct A {
A( const T & x );
};
我想实例化此类的对象而不写出实际类型T,因为这通常是由某种表达式模板和 lambda 函数产生的笨拙类型。实现此目的的一种方法是
template<class T>
A<T> create_A( const T& t ){
return A<T>( t );
}
int main(){
auto a = create_A( complicated_expression );
}
这里我从未写过表达式的实际类型,但这会创建A 的副本,并且如果没有复制构造函数将无法工作。我没有复制(或移动)构造函数。我正在寻找的是类似
A a( complicated_expression );
简洁明了,编译器应该能够找出实际的类型。不幸的是,这不是有效的 C++。那么完成同样事情的最佳有效 C++ 语法是什么?目前我正在这样做:
auto x = complicated_expression;
A<decltype(x)> a(x);
但这似乎是不必要的冗长。有没有更好的方法来做到这一点?
【问题讨论】:
-
从 create_A 返回 A
* 不是一个选项吗? -
“我没有复制(或移动)构造函数”你能提供吗?如果您关心性能,则不必这样做,因为编译器很可能无论如何都会忽略它,只需要定义它以便可以访问它。这似乎是做你想做的最惯用的方式。
-
@dlf 有趣的想法,谢谢。那时我必须考虑进行内存管理的最佳方法。
-
@Suma 实际上我并没有真正考虑过这一点,但现在正如你所提到的,是的,也许这就是要走的路。谢谢。
-
你为什么假设函数
create_A()会创建一个副本。我希望大多数编译器避免使用RVO 进行复制。至少在使用优化时。