如何在结构体中连接std::is_same

How to concatenate std::is_same in a struct

本文关键字:is same std 连接 结构体      更新时间:2023-10-16

我的enable_if语句变得非常长,所以我想以某种方式进行类型定义。我不知道最好的方法是什么。

我试过了,但是不工作

template<typename T>
struct isValidImageFormat
{
    typedef 
        typename std::is_same<T, float>::value || 
        typename std::is_same<T, unsigned char>::value 
        value;
};

错误是:

在»||«标记之前预期的非限定id类型名std::is_same::value ||

问题:

  • 我的代码有什么问题?
  • 我的问题有什么好的解决方案?

您想要std::disjunction(哲学中表示"or"的花哨词):

typedef std::disjunction<
    std::is_same<T, float>, 
    std::is_same<T, unsigned char>> condition;

那么您可以使用condition::value来获得一个真或假的值。或者,如果你只想要一个值,试试这个:

constexpr bool condition =
    std::is_same<T, float>::value || 
    std::is_same<T, unsigned char>::value;

当您想要处理类型时使用typename关键字,在您的示例中,您想要处理constexpr bool值。

template<typename T>
struct isValidImageFormat
{
    constexpr static bool value =  
       std::is_same<T, float>::value || 
       std::is_same<T, unsigned char>::value;
};

实际上不需要结构体。从c++ 14开始,您可以轻松地使用变量模板:

#include <type_traits>
template<typename...>
constexpr bool isValidImageFormatVar = false;
template<typename T, typename U, typename... O>
constexpr bool isValidImageFormatVar<T, U, O...> = std::is_same<T, U>::value || isValidImageFormatVar<T, O...>;
template<typename T>
constexpr bool isValidImageFormat = isValidImageFormatVar<T, float, unsigned char>;
int main() {
    static_assert(isValidImageFormat<float>, "!");
    static_assert(isValidImageFormat<unsigned char>, "!");
    static_assert(not isValidImageFormat<int>, "!");
}

使用此方法,isValidImageFormat<T>的结果始终是std::true_typestd::false_type:

#include <utility>
#include <iostream>
template<typename T>
struct isValidImageFormatImpl
{
    static constexpr bool match = std::is_same<T, float>::value
    or std::is_same<T, unsigned char>::value;
    using type = std::conditional_t<match, std::true_type, std::false_type>;
};

template<typename T>
using isValidImageFormat = typename isValidImageFormatImpl<T>::type;
int main()
{
    std::cout << isValidImageFormat<float>() << 'n';
    std::cout << isValidImageFormat<int>() << 'n';
    static_assert(std::is_same<isValidImageFormat<float>, std::true_type>(), "");
    static_assert(std::is_same<isValidImageFormat<int>, std::false_type>(), "");
}
预期输出:

1
0