Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio 如何优雅地将模板参数限制为`<;某些类别<;AnyT>>;`?_Visual Studio_C++14_Template Specialization_Content Assist_Template Classes - Fatal编程技术网

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。
不幸的是,我讨厌它

参考文献 以下是我阅读的其他链接:-

  • (模板参数)
  • (作为参数与模板类型无关)

您可以编写自定义类型trait
is\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");
};