Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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
C++ 默认_delete的部分专门化_C++_Templates_Metaprogramming_Enable If - Fatal编程技术网

C++ 默认_delete的部分专门化

C++ 默认_delete的部分专门化,c++,templates,metaprogramming,enable-if,C++,Templates,Metaprogramming,Enable If,我想专门化从MyBaseClass派生的所有对象的default_delete。这是我最好的尝试: template <typename T> struct default_delete<typename enable_if<is_base_of<MyBaseClass, T>::value, T>::true_type> { ... }; 模板 结构默认值\u删除 { ... }; 编译器似乎无法识别正在使用我的类型参数“T”,这是可

我想专门化从MyBaseClass派生的所有对象的default_delete。这是我最好的尝试:

template <typename T>
struct default_delete<typename enable_if<is_base_of<MyBaseClass, T>::value, T>::true_type>
{
    ...
};
模板
结构默认值\u删除
{
...
};

编译器似乎无法识别正在使用我的类型参数“T”,这是可以理解的,因为它是“typename”关键字的“下游”。我试图实现的是可能的吗?

正如0x499602D2在注释中所述,如果没有额外的专用模板参数,这是不可能的。您可以使用自己的删除器,如下所示:

template <typename T, typename Enable = void>
struct my_default_delete : public std::default_delete<T> {}; // default to std::default_delete<T>

template <typename T>
struct my_default_delete<T, typename std::enable_if<std::is_base_of<MyBaseClass, T>::value>::type>
{
    void operator() (T* ) { /* Your specific implementation */ }
};
模板
struct my_default_delete:public std::default_delete{};//默认设置为std::默认设置\u删除
模板
结构我的默认值删除
{
void操作符()(T*){/*您的特定实现*/}
};

请发布您得到的错误(最好是显示错误的最小示例)。您的参数声明是未计算的上下文(即
T
无法从给定参数推断)
default\u delete
必须有一个允许SFINAE类型表达式的额外参数,否则不可能(AFAIK)。或者,您可以实现自己的deleter。如果::type,是否应该启用它?@Oguk:class-template-partial-specification包含一个无法推导的模板参数;这种局部专业化将永远不会发生used@0x499602D2:关于SFINAE需要额外参数,我认为你是对的。我真的不希望每次为派生类声明唯一的\u ptr时都必须指定一个deleter,但这里的问题是deleter不再是“默认”deleter。i、 e.我需要手动指定此删除程序,如:unique_ptr@yxrkt:您可以使用my_unique\u ptr=std::unique\u ptr添加一个额外的层:
模板模板别名将是惊人的,但我们的项目使用的是vs2012:(