在这个问题中:
template; Point<2, double>; Point<3, double>
丹尼斯和迈克尔注意到了不合理的愚蠢实现的构造函数。
他们是对的,我当时没有考虑这个。
但是我发现构造函数对于像这样的模板类并没有太大帮助,相反这里有一个函数更方便和安全
namespace point {
template < unsigned int dims, typename T >
struct Point {
T X[ dims ];
std::string str() {
std::stringstream s;
s << "{";
for ( int i = 0; i < dims; ++i ) {
s << " X" << i << ": " << X[ i ] << (( i < dims -1 )? " |": " ");
}
s << "}";
return s.str();
}
Point<dims, int> toint() {
Point<dims, int> ret;
std::copy( X, X+dims, ret.X );
return ret;
}
};
template < typename T >
Point< 2, T > Create( T X0, T X1 ) {
Point< 2, T > ret;
ret.X[ 0 ] = X0; ret.X[ 1 ] = X1;
return ret;
}
template < typename T >
Point< 3, T > Create( T X0, T X1, T X2 ) {
Point< 3, T > ret;
ret.X[ 0 ] = X0; ret.X[ 1 ] = X1; ret.X[ 2 ] = X2;
return ret;
}
template < typename T >
Point< 4, T > Create( T X0, T X1, T X2, T X3 ) {
Point< 4, T > ret;
ret.X[ 0 ] = X0; ret.X[ 1 ] = X1; ret.X[ 2 ] = X2; ret.X[ 3 ] = X3;
return ret;
}
};
int main( void ) {
using namespace point;
Point< 2, double > p2d = point::Create( 12.3, 34.5 );
Point< 3, double > p3d = point::Create( 12.3, 34.5, 56.7 );
Point< 4, double > p4d = point::Create( 12.3, 34.5, 56.7, 78.9 );
//Point< 3, double > p1d = point::Create( 12.3, 34.5 ); //no suitable user defined conversion exists
//Point< 3, int > p1i = p4d.toint(); //no suitable user defined conversion exists
Point< 2, int > p2i = p2d.toint();
Point< 3, int > p3i = p3d.toint();
Point< 4, int > p4i = p4d.toint();
std::cout << p2d.str() << std::endl;
std::cout << p3d.str() << std::endl;
std::cout << p4d.str() << std::endl;
std::cout << p2i.str() << std::endl;
std::cout << p3i.str() << std::endl;
std::cout << p4i.str() << std::endl;
char c;
std::cin >> c;
}
新的 C++ 标准是否对模板类的 ctor 这方面有任何新的改进、语言特性或简化?
对于namespace、stuct和Create function的组合实现,你怎么看?
非常感谢
糟糕
最佳答案
由于数组是公共(public)的,因此可以选择省略构造函数并允许聚合初始化(例如 boost::array<T, N>
)。
Point<2, int> p = {1, 2};
这并不比必须调用创建函数更糟糕。 (创建函数作为实用程序可能仍然很方便。)
在 C++0x 中,您将能够享受到各种酷炫。例如,使用可变参数模板,在编译时检查构造函数是否使用正确数量的参数调用。 (以下代码还可以检查参数 ...U
是否都是 T
类型,元编程更有趣,但这可能不是绝对必要的。)
//helper to copy variable amount of arguments into an array
namespace detail {
template <class T, class U>
void copy_variadic(T* p, U value)
{
*p = value;
}
template <class T, class First, class ...Rest>
void copy_variadic(T* p, First var, Rest ...args)
{
*p = var;
copy_variadic(++p, args...);
}
} //detail
template < unsigned int dims, typename T >
struct Point {
T X[ dims ];
Point() : X{}
{
}
template <class ...U>
Point(U... args) {
static_assert(sizeof...(args) == dims, "Too many or too few arguments to Point constructor");
detail::copy_variadic(X, args...);
}
//...
};
(实际上,经过一些修改 - 完美转发 - copy_variadic
会很好地补充我的可变参数模板实用程序集,如果没有人来指出更好的方法的话。)
关于c++ - 模板类 : ctor against function -> new C++ standard,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2794369/