ostream 运算符的编译时重载
Compile time overloading for ostream operator
我正在尝试引入基于对象级别的重载机制。
我设法实现了基于 other post 的简单示例,它适用于简单类型:
https://coliru.stacked-crooked.com/a/8129de0ae8a71af1
现在我想为自定义类型做一些类似的事情:
#include <iostream>
#include <type_traits>
#include <sstream>
class Foo {
};
template < class T,
typename std::enable_if <(std::rank<T>::value == 0), int>::type = 0 >
void f(std::ostream& os, const T& value)
{
os << "rank: 0" << std::endl;
}
template< class T,
typename std::enable_if<(std::rank<T>::value == 1), int>::type = 0 >
void f(std::ostream& os, const T& value)
{
os << "rank: 1" << std::endl;
}
template <class T>
std::ostream& operator<<(std::ostream& os, const T& foo)
{
f<decltype(foo)>(os, foo);
return os;
}
int main()
{
Foo foo0;
Foo foo1[5];
//std::cout << std::rank<decltype(foo0)>{} << "\n"; // 0
//std::cout << std::rank<decltype(foo1)>{} << "\n"; // 1
// correct
f<decltype(foo0)>(std::cout, foo0); //prints: rank: 0
f<decltype(foo1)>(std::cout, foo1); //rank: 1
// invalid
std::cout << foo0; //prints: rank: 0
std::cout << foo1; //rank: 0
return 0;
}
https://coliru.stacked-crooked.com/view?id=cf91cec14a111f70
当我直接调用函数时,我收到了有效结果,但是当我通过 << 执行时,每次我都得到 0。
你能解释一下我做错了什么吗?
这里不用decltype
,直接用T
:
template<class T>
std::ostream& operator<<(std::ostream& os, const T& foo)
{
f< T >(os, foo);
return os;
}
但是在使用 decltype
时,您必须从 foo
类型中删除引用:
template<class T>
std::ostream& operator<<(std::ostream& os, const T& foo)
{
f< std::remove_reference_t< decltype(foo) > >(os, foo);
return os;
}
当模板类型推导有效时,T 被推导为 Foo [5]
- rank
所支持的。但是当你做 decltype(foo)
时,它 returns 也输入 const &
- 所以你有 const Foo (&)[4]
。 rank
因为那个东西行不通。
我正在尝试引入基于对象级别的重载机制。 我设法实现了基于 other post 的简单示例,它适用于简单类型: https://coliru.stacked-crooked.com/a/8129de0ae8a71af1
现在我想为自定义类型做一些类似的事情:
#include <iostream>
#include <type_traits>
#include <sstream>
class Foo {
};
template < class T,
typename std::enable_if <(std::rank<T>::value == 0), int>::type = 0 >
void f(std::ostream& os, const T& value)
{
os << "rank: 0" << std::endl;
}
template< class T,
typename std::enable_if<(std::rank<T>::value == 1), int>::type = 0 >
void f(std::ostream& os, const T& value)
{
os << "rank: 1" << std::endl;
}
template <class T>
std::ostream& operator<<(std::ostream& os, const T& foo)
{
f<decltype(foo)>(os, foo);
return os;
}
int main()
{
Foo foo0;
Foo foo1[5];
//std::cout << std::rank<decltype(foo0)>{} << "\n"; // 0
//std::cout << std::rank<decltype(foo1)>{} << "\n"; // 1
// correct
f<decltype(foo0)>(std::cout, foo0); //prints: rank: 0
f<decltype(foo1)>(std::cout, foo1); //rank: 1
// invalid
std::cout << foo0; //prints: rank: 0
std::cout << foo1; //rank: 0
return 0;
}
https://coliru.stacked-crooked.com/view?id=cf91cec14a111f70
当我直接调用函数时,我收到了有效结果,但是当我通过 << 执行时,每次我都得到 0。 你能解释一下我做错了什么吗?
这里不用decltype
,直接用T
:
template<class T>
std::ostream& operator<<(std::ostream& os, const T& foo)
{
f< T >(os, foo);
return os;
}
但是在使用 decltype
时,您必须从 foo
类型中删除引用:
template<class T>
std::ostream& operator<<(std::ostream& os, const T& foo)
{
f< std::remove_reference_t< decltype(foo) > >(os, foo);
return os;
}
当模板类型推导有效时,T 被推导为 Foo [5]
- rank
所支持的。但是当你做 decltype(foo)
时,它 returns 也输入 const &
- 所以你有 const Foo (&)[4]
。 rank
因为那个东西行不通。