专用模板成员函数 [SFINAE]
specialize template member function [SFINAE]
基于这个问题和"Dave"提供的答案,如何专门处理非整数类型来处理类型说QDate
(在Qt中用于处理与日期相关的任务)?
我想专攻的功能是:
void extract(const std::string str)
{
std::bitset<sizeof(T) * CHAR_BIT> bs(str.substr(m_start, m_len));
m_data = static_cast<T>(bs.to_ulong());
}
向此函数提供 1 和 0 的std::string
,然后根据开始和长度,我需要将其转换为包含此函数的模板类实例化的类型。当类型不是整数或无法使用std::bitset
生成时,这是没有意义的。
我不确定我是否完全理解您的用例,但我认为它与此类似
template<typename T>
struct foo
{
T m_data;
// others ...
void extract(const std::string str)
{
std::bitset<sizeof(T) * CHAR_BIT> bs(str.substr(m_start, m_len));
m_data = static_cast<T>(bs.to_ulong());
}
};
但是您希望extract
在使用QDate
实例化foo
时执行不同操作。有几种不同的方法可以做到这一点,SFINAE就是其中之一。
但是你不能简单地附加一个enable_if
表达式来extract
因为要使 SFINAE 正常工作,替换失败需要在直接上下文中发生,并且在实例化foo<T>::extract
时T
是已知的。因此,将虚拟模板参数添加到默认为 T
的extract
template<typename U=T>
typename std::enable_if<std::is_same<U, QDate>::value>::type
extract(const std::string str)
{
// this will be used when T=QDate
}
template<typename U=T>
typename std::enable_if<!std::is_same<U, QDate>::value>::type
extract(const std::string str)
{
// this will be used when T!=QDate
}
如果extract
是唯一改变行为的东西,那么实现此目的的另一种方法是将所有通用功能移动到foo
继承的另一个类。
template<typename T>
struct foo_base
{
// common functionality
};
template<typename T>
struct foo : foo_base<T>
{
void extract(const std::string str)
{
std::bitset<sizeof(T) * CHAR_BIT> bs(str.substr(m_start, m_len));
m_data = static_cast<T>(bs.to_ulong());
}
};
// Specialization for QDate
template<>
struct foo<QDate> : foo_base<QDate>
{
void extract(const std::string str)
{
// QDate specific functionality
}
};
相关文章:
- 为什么使用SFINAE而不是函数重载
- 如何使用模板函数的函数签名进行SFINAE
- 编译器如何在使用SFINAE的函数和标准函数之间确定两者是否可行
- 表达式 SFINAE:如何根据类型是否包含具有一个或多个参数的函数来选择模板版本
- 基于 SFINAE 的特征实现问题与函数模板重载
- 函数模板实例化的 sfinae
- 使用表达式 SFINAE 的函数模板的类外定义
- C++SFINAE enable_if_t成员函数,如何消除歧义?
- 使用SFINAE来检测void返回类型函数的存在
- 构造函数SFINAE和继承在clang中失败
- 关于SFINAE的函数和结构之间的差异
- C++:SFINAE 来区分填充和范围构造函数?
- 使用 SFINAE 有选择地实例化模板的成员函数
- SFINAE 用于具有默认参数的函数对象
- SFINAE 和模板函数实例化:为什么在启用了 SFINAE 类型的函数参数中使用模板参数时无法推断模板参数?
- SFINAE :删除具有相同原型的函数
- 检查类型 T 是否具有成员函数 SFINAE 的任何重载
- SFINAE :知道一个函数是否已经存在
- Constexpr 函数作为 SFINAE 的模板参数
- 简单的 SFINAE 示例以重载函数不编译