Visual studio 如何优雅地将模板参数限制为`<;某些类别<;AnyT>>;`?
如何将Visual studio 如何优雅地将模板参数限制为`<;某些类别<;AnyT>>;`?,visual-studio,c++14,template-specialization,content-assist,template-classes,Visual Studio,C++14,Template Specialization,Content Assist,Template Classes,如何将Wrapper的模板参数限制为Wrapper和 它与解决方案2具有相同的缺点。 这对于普通用户来说并不明显 解决方案4(SNIFAE,失败1) 通过在模板类声明(Wrapper)上添加std::enable_if,我可以得到一个有效的hack。 不幸的是,我讨厌它 参考文献 以下是我阅读的其他链接:- (模板参数) (作为参数与模板类型无关) 您可以编写自定义类型traitis\u specialization,如下所示: template<class Type, template
Wrapper
的模板参数限制为Wrapper和
它与解决方案2具有相同的缺点。
这对于普通用户来说并不明显
解决方案4(SNIFAE,失败1)
通过在模板类声明(Wrapper
)上添加std::enable_if
,我可以得到一个有效的hack。
不幸的是,我讨厌它
参考文献
以下是我阅读的其他链接:-
- (模板参数)
- (作为参数与模板类型无关)
您可以编写自定义类型traitis\u specialization
,如下所示:
template<class Type, template<class...> class Template>
struct is_specialization
: std::false_type {};
template<template<class...> class Template, class... TArgs>
struct is_specialization<Template<TArgs...>, Template>
: std::true_type {};
class ShowError : public Wrapper<B,MyArray<C>>{
Test n=0; //<-- unknown "Test" (intellisense)
};
template<class T> class MyArray{
public: using MyArrayT=T;
};
template<class T,class T2> class Wrapper{
public: using myT=typename T2::MyArrayT;
//^ assert at compile time
};
class MyArrayBase{};
template<class T> class MyArray : public MyArrayBase{ };
template<class T,class T2> class Wrapper{
//check something around MyArrayBase *object = new T2();
// or "is_base_of"
};
template<class Type, template<class...> class Template>
struct is_specialization
: std::false_type {};
template<template<class...> class Template, class... TArgs>
struct is_specialization<Template<TArgs...>, Template>
: std::true_type {};
template<class T,class T2>
class Wrapper {
static_assert(is_specialization<T2, MyArray>::value, "T2 must be a specialization of MyArray");
};