涉及嵌套模板参数和默认值的模板类型推导
Template type deduction involving nested template parameters and defaults
我有以下代码:
#include <type_traits>
#include <memory>
class CDelegateCore {};
class CDelegate : public CDelegateCore {};
class CEvent
{
private:
/// Simple empty enumeration used for enable_if test.
enum class enabler_t {};
template<typename T>
using EnableIf = typename std::enable_if<T::value, enabler_t>::type;
public:
CEvent() {}
~CEvent() {}
void operator += (CDelegateCore* func) {}
template<typename T, typename Deleter, EnableIf<std::is_base_of<CDelegateCore, T>> = enabler_t{}>
void operator += (std::unique_ptr<T, Deleter> const& func) { *this += func.get(); }
};
int main()
{
std::unique_ptr<CDelegate> testdel;
// ... initialize testdel ...
CEvent EVENT;
EVENT += testdel;
}
这里的目标是,当我有一个由std::unique_ptr
拥有的CDelegate
时,将调用使用std::enable_if
的CEvent
中的+=
重载,并推导出std::unique_ptr
中的模板参数。
这段代码在GCC和Clang中运行良好,但在MSVC12中失败了。它无法解析函数。有人能告诉我为什么吗?我最初没有unique_ptr deleter的模板参数,它确实有效,但我不确定C++中关于使用默认嵌套模板参数进行类型推导的规则是什么。
我对此不确定,但我相信这是因为VS2013中缺乏对表达式SFINAE的支持。如果将enable_if
表达式移动到operator+=
的返回类型,则可以使代码在VS2013(以及gcc和clang)上工作
template<typename T, typename Deleter>
typename std::enable_if<std::is_base_of<CDelegateCore, T>::value>::type
operator += (std::unique_ptr<T, Deleter> const& func) { *this += func.get(); }
您可以通过将第二个模板参数更改为void
来使用EnableIf
别名,或者只使用std::enable_if_t
(在gcc和clang上需要-std=c++1y
)。
实时演示
VS2013支持SFINAE或至少支持其大部分。更改
template<typename T, typename Deleter, EnableIf<std::is_base_of<CDelegateCore, T>> = enabler_t{}>
至
template<typename T, typename Deleter, class = EnableIf<std::is_base_of<CDelegateCore, T>>>
相关文章:
- C++(和 ROS) - 包含与前向声明引用,设置默认值和类型定义
- 如果输入类型与目标类型不同,"cin"变量是否重置为某个默认值?
- 具有默认类型和值的模板参数
- 具有默认值的参数的自动类型扣除
- 根据模板参数的默认值启用模板参数类型的自动扣除
- 为 vardiac 和普通模板设置类型名称默认值
- 调用类型的标记构造函数(如果可用),否则为默认值
- 未知模板类型的默认值或零值
- 基本类型的std ::向量的默认值
- AnsiString作为Embarcadero C++Builder中字符串类型的默认值
- 如何获取任何类型的默认值
- 为LONGLONG类型指定默认值.明戈GCC
- 如果我在 C++ 中为 "std::string &" 类型的参数指定默认值,这会导致内存泄漏吗?
- 如何将未知类型的数据成员初始化为默认值
- 涉及嵌套模板参数和默认值的模板类型推导
- C++数值类型的非零默认值 - 重塑
- 如何在编译时通过模板形参默认值的名称/指针获取函数的类型
- 模板默认类型vs默认值
- 内置类型的模板参数默认值
- c++中POD类型的默认值和值初始化