繁体   English   中英

标签c ++ template class member struct成员语法初始化

[英]c++ Template class member struct initialization syntactic sugar

给定一个班级:

template <typename T>
class foo
{
public:
    struct bar
    {
        bar(T value) { m_foo = value; }
        T m_foo;
        ...
    }
    ...
}

和一个实例:

foo<int> myfoo;

是否可以创建bar的实例而不必再次指定myfoo的类型,如下所示:

myfoo::bar mybar;
// foo<int>::bar mybar;

当我尝试这个时,我得到一个错误对(VS 2015)

'myfoo':不是类或名称空间名称

'bar':找不到标识符

这里的更新是我要实现的更详细的示例:

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;

表面上,我将使用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));

但是,您也可以为您的类模板赋予转发构造函数模板:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM