gpt4 book ai didi

c++ - 简化将不同类型分派(dispatch)给 C++ 中不同函数的代码

转载 作者:行者123 更新时间:2023-11-30 02:28:59 25 4
gpt4 key购买 nike

我想编写一个函数,为迭代器类型和其他类型打印不同的值。在做了一些研究之后,这是我想出的:

#include <iostream>
#include <iterator>
#include <experimental/type_traits>

namespace details
{
template <class T, class = void>
struct is_iterator : std::false_type
{
};

template <class T>
struct is_iterator<T, std::experimental::void_t<typename std::iterator_traits<T>::value_type>> : std::true_type
{
};

template <class T>
constexpr auto is_iterator_v = is_iterator<T>::value;
}

template <class T>
std::enable_if_t<!details::is_iterator_v<T>> print(const T &value)
{
std::cout << value;
}

template <class T>
std::enable_if_t<details::is_iterator_v<T>> print(const T &value)
{
std::cout << "(IteratorTo ";
print(*value);
std::cout << ')';
}

但是我觉得我的代码有点太长,有点复杂。是否可以让我的代码更短更清晰?

最佳答案

SFINAE是你的 friend 吗:

template<class T>
constexpr std::true_type is_iterator(typename std::iterator_traits<T>::value_type*, int) {
return {};
}

template<class T>
constexpr std::false_type is_iterator(void*, long) {
return {};
}

template<class T>
constexpr auto is_iterator_v = is_iterator<T>(nullptr, 0);

此外,print 的另一种实现方式是使用标记分派(dispatch),您可能会发现它更具可读性,也可能不会:

template<class T>
void print(const T &);

namespace details {
template<class T>
void print(const T &value, std::false_type) {
std::cout << value;
}

template<class T>
void print(const T &value, std::true_type) {
std::cout << "(IteratorTo ";
print(*value);
std::cout << ')';
}
}

template<class T>
void print(const T &value) {
details::print(value, details::is_iterator_v<T>);
}

关于c++ - 简化将不同类型分派(dispatch)给 C++ 中不同函数的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40151580/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com