问题
我有S<?,?,?,?>
一个模板类。
根据设计,函数f()
始终接受类型的参数S<?,?,?,?>*
。
下面的代码运行良好,但我失去了内容辅助的生活质量。
template<
class Src_Param
,class Dst_Param
,int X1_Param
,int X2_Param
>class S{public:
using Src=Src_Param;
using Dst=Dst_Param;
static constexpr int X1=X1_Param;
static constexpr int X2=X2_Param;
};
template<class S_Something> static void f(S_Something* s){
s-> ///<== test 1
}
按下->
或时ctrl+enter,这是我从 IDE 获得的帮助。
它很悲伤,很空洞。::-
我糟糕的解决方法
我创建了一个名为 的化妆品别名Self
。
新的别名很简单。
在每个用例中,Self<T> = T
,并且T
这里始终是S<....something....>
(根据设计)。
template<class Param> using Self
=S<typename Param::Src,typename Param::Dst,Param::X1,Param::X2>;
template<class S_Something> static void f(S_Something* s){
using S2=Self<S_Something>;
S2* s2=s;
s2-> ///<== test 2
S2:: ///<== test 3
}
现在,我又找回了可爱的内容辅助 (intellisense)。它起作用了。
这是 test2 的结果。
这是 test3 的结果。
^^ 它很实用而且很漂亮。
问题
不幸的是,我的新Self
别名降低了可维护性。
如果我需要添加更多模板参数S::X3_Param
,那么Self
也必须更新。
有没有办法提示内容辅助(最好使用适当的语法),S_Something
里面f()
总是S<...something...>
,而不会牺牲性能?
我正在使用 Visual Studio,但我更喜欢不依赖于 IDE 的解决方案。
不,目前您没有对模板参数施加任何限制
S_Something
,因此在编写代码时无法知道之后会发生什么s->
。您可以通过更改来解决这个问题
f
,使f
函数参数的类型为S<S_Something>
。这样做也会让您的其他测试用例正常工作。