【发布时间】:2019-09-22 11:45:30
【问题描述】:
我设法根据对象的等级为std::ostream 重载插入运算符。
我想扩展下面的例子。
当包含A_new.h 时,它包含A.h...在这种情况下,我正在检查对象的等级,我正在调用f_alterantive 或f_old。按预期工作:)
直接包含A.h时出现问题,那么f()的实例只有一个-f_old。
如果只有一个f() 的实例直接通过A.h 包含,那么它应该是所有对象的默认值...(不仅适用于rank > 1,也适用于所有其他对象)
并且低于条件没有意义。
typename std::enable_if <(std::rank<T>::value > 1), int>::type = 0 >
我知道我需要指定检查另一个 f() 是否存在的条件:
类似:
//goal: typename std::enable_if <((f_alternative_exist == false) || (std::rank<T>::value > 1 && f_alternative_exist == true) ), int>::type = 0 >
我找到了similar question,但我仍然不确定如何使用std::enable_if 进行操作
#include <iostream>
#include <type_traits>
#include <sstream>
class Foo {
};
//--- alternative header A_new.h
//#include A.h
template< class T,
typename std::enable_if<(std::rank<T>::value == 1), int>::type = 0 >
void f(std::ostream& os, const T& value)
//f_alternative
{
os << "alternative function\n";
os << "rank == 1" << std::endl;
}
//----
//---- old header A.h
template < class T,
typename std::enable_if <(std::rank<T>::value > 1), int>::type = 0 >
//goal: typename std::enable_if <((f_alternative_exist == false) || (std::rank<T>::value > 1 && f_alternative_exist == true) ), int>::type = 0 >
void f(std::ostream& os, const T& value)
//f_old
{
os << "old function\n";
os << "rank > 1" << std::endl;
}
template <class T>
std::ostream& operator<<(std::ostream& os, const T& foo)
{
f<T>(os, foo);
return os;
}
//-----
int main()
{
Foo foo1[5];
Foo foo2[5][5];
std::cout << foo1;
std::cout << foo2;
return 0;
}
https://coliru.stacked-crooked.com/a/7f7ef7bda1805a36
您能否告诉我如何指定std::enable_if 在f() 未超载以及何时应在所有情况下运行时也可以工作?
【问题讨论】:
标签: c++ templates c++14 sfinae enable-if