gpt4 book ai didi

c++ - enable_if 和多个条件的问题

转载 作者:可可西里 更新时间:2023-11-01 18:15:43 29 4
gpt4 key购买 nike

我尝试实现一个将泛型类型转换为字符串的函数。整数类型需要使用 std::to_string() 转换,字符串和字符使用 std::string() 和 vector ,一个元素一个元素地转换为一个字符串其他方法(取决于它们的内容)。

这是我的:

//Arithmetic types    

template<class T>
typename std::enable_if<std::is_arithmetic<T>::value, std::string>::type convertToString(const T& t){
return std::to_string(t);
}

//Other types using string ctor

template<class T>
typename std::enable_if<std::__and_<std::__not_<std::is_arithmetic<T>>::type,
std::__not_<std::is_same<T, <T,
std::vector<typename T::value_type, typename T::allocator_type>>::value
>>>::value, std::string>::type convertToString(const T& t){
return std::string(t);
}

//Vectors

template<class T>
typename std::enable_if<std::is_same<T, std::vector<typename T::value_type,
typename T::allocator_type>>::value, std::string>::type convertToString(const T& t){
std::string str;
for(std::size_t i = 0; i < t.size(); i++){
str += convertToString(t[i]);
}
return str;
}

问题是第二个函数没有编译。我如何设计第二个函数,使其能够编译(和工作)并且不会产生歧义问题?

最佳答案

Oktalist's答案解释了为什么您的类型特征无法编译。另外,你不应该使用 __and___not_ .这些是保留的,可以在下一个编译器版本中轻松更改。实现您自己的这些特征版本非常容易(例如,参见 conjunction 的可能实现)。

我建议采用完全不同的方法。我们可以使用 choice<>使重载这些情况变得简单得多:

template <int I> struct choice : choice<I+1> { };
template <> struct choice<10> { };

通过:

// arithmetic version
template <class T>
auto convertToStringHelper(T const& t, choice<0> )
-> decltype(std::to_string(t))
{
return std::to_string(t);
}

// non-arithmetic version
template <class T>
auto convertToStringHelper(T const& t, choice<1> )
-> decltype(std::string(t))
{
return std::string(t);
}

// vector version
template <class T, class A>
std::string convertToStringHelper(std::vector<T,A> const& v, choice<2> )
{
// implementation here
}

template <class T>
std::string convertToString(T const& t) {
return convertToStringHelper(t, choice<0>{});
}

这很好,因为您可以获得所有 SFINAE 而没有任何 enable_if废话。

关于c++ - enable_if 和多个条件的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41534517/

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