[英]c++ Template class member struct initialization syntactic sugar
Given a class: 给定一个班级:
template <typename T>
class foo
{
public:
struct bar
{
bar(T value) { m_foo = value; }
T m_foo;
...
}
...
}
and an instance: 和一个实例:
foo<int> myfoo;
is it possible to create an instance of bar
without having to specify myfoo
's types again like this: 是否可以创建bar
的实例而不必再次指定myfoo
的类型,如下所示:
myfoo::bar mybar;
// foo<int>::bar mybar;
when I try this I get an error-pair (VS 2015) : 当我尝试这个时,我得到一个错误对(VS 2015) :
'myfoo': is not a class or namespace name 'myfoo':不是类或名称空间名称
'bar': identifier not found 'bar':找不到标识符
UPDATE here is a more detailed example of what I want to achieve: 这里的更新是我要实现的更详细的示例:
template <typename T, typename T2, typename T3>
class MyClass
{
public:
struct MyClassCreateParameters
{
MyClassCreateParameters( T t, T2 t2, T3 t3 )
:
T1Param( t ), T2Param( t2 ), T3Param( t3 ) { }
T T1Param;
T2 T2Param;
T3 T3Param;
};
MyClass( const MyClassCreateParameters& params )
:
m_t1( params.T1Param ),
m_t2( params.T2Param ),
m_t3( params.T3Param ) { }
private:
const T m_t1;
const T2 m_t2;
const T3 m_t3;
};
int main()
{
MyClass< int, char, char* >* myclass;
myclass = new MyClass< int, char, char* >(
myclass::MyClassCreateParameters( 1, 'A', "abc" ) );
return 0;
}
使用C ++ 11,您应该能够:
decltype(myfoo)::bar mybar;
On the face of it, I would use a typedef: 表面上,我将使用typedef:
template <typename T1, typename T2, typename T3>
class MyClassTemplate
{
public:
struct Params { /* ... */ };
MyClassTemplate(Params);
// ...
};
using MyClass = MyClassTemplate<int, char, char*>;
MyClass x(MyClass::Params(a, b, c));
However, you could also endow your class template with a forwarding constructor template: 但是,您也可以为您的类模板赋予转发构造函数模板:
template <typename T1, typename T2, typename T3>
class MyClassTemplate
{
private:
struct Params { /* ... */ };
MyClassTemplate(Params);
public:
template <typename ...Args>
MyClassTemplate(Args ...args) : MyClassTemplate(Params(args...)) {}
// ...
};
MyClassTemplate<int, char, char*> x(a, b, c);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.