【发布时间】:2017-10-17 21:15:21
【问题描述】:
如何使模板类型在内部更具体以帮助内容辅助?
template<class T>class B{ //note: in real case, it has more template parameter
public: void f(){}
};
template<class B1>class C{ //<-- I know for sure that B1 derived from "B<something>".
B1* b;
void test(){
b->
^ ctrl+space doesn't show f()
}
};
我糟糕的解决方法是在 C 类中创建模板专业化,但它会以另一种方式混淆内容辅助。
下面是另一种解决方法,但它很乏味。
我必须在B 反映模板参数,并在C 一个接一个地使用这样的反映。
template<class T>class B{
public: using reflectiveT=T;
/* other T e.g. reflectiveT2=T2 , ... */
public: void f(){}
};
template<class B1>class C{
using BX=B<B1::reflectiveT>; //B<B1::reflectiveT1,..T2,...T3> ... tedious
BX* b;
void test(){
b->
^ ctrl+space will show f()
}
};
问题:
- 它遭受可维护性问题,
当我想重构
B以便以后有更多/更少的模板参数时。 - 如果
BX恰好是从B<something>派生的类,BXT将 !=BX。
我的梦想是:
template<class B1>class C{
using BX=B<...> as base of B1; //????
};
我可能也依赖内容辅助,但它极大地帮助我编写非常复杂的类。
编辑
我不能只在 B 中传递 Args 作为 C 的模板参数,因为 C 可能会出错。
例如,B<D>::callback 将被调用而不是下面代码中的D::callback (demo):-
class x{};
template<class T>class B{
public: static void callback(){ std::cout<<"B<D>::callback()"; }
};
class D : public B<D>{ //
public: static void callback(){ std::cout<<"D::callback()"; }
};
template<class... Args>class C{
using BX=B<Args...>;
BX* b;
public: void test(){
BX::callback();
//^ will invoke B<D>::callback (wrong)
// instead of D::callback
}
};
int main(){
C<D> c; c.test(); //print "B<D>::callback()"
}
编辑:大大简化问题。
【问题讨论】:
-
如果您说的是 Intellisense,我不确定这是否是一项功能。
-
@Gill Bates 是的,我说的是 Intellisense 或任何可以在 Visual-Studio 中帮助我的插件(reshaper/visual-assist)。我编辑了标签,谢谢。
-
即使
BTX是B<..>,btx->也没有必要的f()(因为专业化)。 -
@Jarod42 ... 至少,让它只在没有专业化的情况下工作......或者总是显示
f(),即使在某些专业化中没有这样的功能...... . 我更喜欢说话太多而不是沉默的内容辅助。 -
你有什么理由不想在
B类的参数上创建类C模板?例如。template <typename... Args> class C { using BXT = B<Args...>; }.
标签: c++ visual-studio templates c++14 intellisense