C++基于模板成员的存在进行成员重载
C++ member overloads based on existence of template member
我一直从一些SFINAE开始,但我无法完全掌握我想使用它的一些情况。
例如,如果我有一个基于模板的类,它应该根据模板参数具有不同的函数实现,即
template <typename T>
class cExampleClass
{
/// Function enabled when "cExampleClass::member" exists
auto overloadedFunction() -> decltype((std::declval<t>().member()),T::some_dependant_type())
{
// Do some stuff and use cExampleClass::member
}
/// Function enabled when "cExampleClass::member" does not exist
auto overloadedFunction() -> T::some_dependant_type()
{
// Do some different stuff
}
};
理想的情况是将函数调用为
object.overloadedFunction();
我的编译器抛出
错误:"类 cARD"没有名为"成员"的成员
在 decltype 行上(即使未定义回退函数(。这似乎与这里的答案相矛盾,那么定义尾随返回类型的正确方法是什么?
此外,该函数显然不能重载。有没有一种简单的方法来定义回退函数?
您有一个硬错误,因为您的方法不是模板,请将其更改为:
template <typename U>
class cExampleClass
{
/// Function enabled when "cExampleClass::member" exists
template <typename T = U>
auto overloadedFunction()
-> decltype((std::declval<T>().member()),T::some_dependant_type())
{
// Do some stuff and use cExampleClass::member
}
/// Function enabled when "cExampleClass::member" does not exist
template <typename T = U>
auto overloadedFunction() -> decltype(T::some_dependant_type())
{
// Do some different stuff
}
};
但是您会遇到问题,因为该方法对于同时满足两个条件的类型是不明确的。
添加标记以排序重载是可能的:
template <std::size_t I>
struct overload_tag : overload_tag<I - 1> {};
template <>
struct overload_tag<0> {};
然后
template <typename U>
class cExampleClass
{
private:
/// Function enabled when "cExampleClass::member" exists
/// Preferred function
template <typename T = U>
auto overloadedFunction(overload_tag<1>)
-> decltype((std::declval<T>().member()),T::some_dependant_type())
{
// Do some stuff and use cExampleClass::member
}
/// Function enabled when "cExampleClass::member" does not exist
template <typename T = U>
auto overloadedFunction(overload_tag<0>) -> decltype(T::some_dependant_type())
{
// Do some different stuff
}
public:
template <typename T = U>
auto overloadedFunction() -> decltype(overloadedFunction(overload_tag<1>{}))
{
return overloadedFunction(overload_tag<1>{});
}
};
相关文章:
- 将重载的成员函数传递给函数模板
- 在运算符重载定义中使用成员函数(const错误)
- 重载运算符的范围是什么?它是否会影响作为类成员的集合的插入函数?
- 解决模板成员函数重载
- 为什么不允许成员函数和非成员函数之间的函数重载?
- 为什么 std::sort 找不到合适的(静态成员)函数重载?
- 如何为非常量和常量重载实现一次成员函数?
- 为什么重载运算符<<打印特征类成员会导致段错误?
- 运算符重载作为成员函数
- 指向重载静态成员的函数指针 - 在unique_ptr中用作自定义删除器
- 将基类的成员函数重载到其他派生类C++
- 重载具有 2 个相同数据类型成员的构造函数
- 关于在成员重载中使用 std::move() 的问题
- 成员函数不能为集合迭代器和const_iterator的输入重载(但可以为其他 STL 迭代器重载)
- 如何正确返回带有成员变量的重载运算符++?
- 在设计方面:重载vector类型的类成员的插入运算符
- 派生类不能用另一个基类的成员重载基类中的私有成员
- 用于测量重载运算符和成员函数的时间的函数
- C++基于模板成员的存在进行成员重载
- 用于类成员重载方法的 SFINAE