Visual C++ 模板类成员结构初始化语法糖
visual 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);
相关文章:
- 多成员Constexpr结构初始化
- 为什么用结构初始化数组需要指定结构名称
- 使用指定的初始值设定项聚合匿名结构初始化
- 不同的类或结构初始化方法之间的性能差异是什么?
- 如何在结构初始化中获取成员C++
- C++正确的结构初始化
- 使用大括号进行结构初始化
- 内部结构初始化不起作用 - C++
- 使用嵌套结构初始化并集
- 使用匿名结构初始化联合
- 结构初始化语法
- 结构初始化的 C++ 向量
- C++嵌套结构初始化和访问成员
- 结构初始化中的常量正确性
- 使用 C++ 中的自定义元素进行 Const 结构初始化
- 如何在结构C++初始化内置数组
- Visual C++ 模板类成员结构初始化语法糖
- C++结构初始化
- C 在结构初始化过程中带有内部阵列的奇怪错误
- 此C/C 的结构初始化器如何使用足够的字段工作