如何在结构体中连接std::is_same
How to concatenate std::is_same in a struct
我的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_type
或std::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
相关文章:
- Why is UINT32_MAX + 1 = 0?
- C++错误:"error: int aaa::bbb is protected within this context"
- 创建具有 new in 函数和"this is nullptr"异常的对象
- 使用 cmake 的 Linux 终端上的"Conversion to non-scalar type is requested"错误
- Is !NaN not a NaN?
- 为什么 Same<T, U> 不包含 Same<U, T>?
- Trie*& 和 Trie** 的意思是 Same?
- Directx 11 - CompileFromFile() is not compiling
- Centos7 g++ "to_string is not in a member of std"
- "Unable to start debugging. No process is associated with this object." - 在Visual Studio Code中使用GDB
- Where is std::hardware_destructive_interference_size?
- 将成员函数作为构造函数参数调用时出错 "Variable is not a type name"
- 为什么 std::shared_ptr 被认为是"heavy"和"expensive",但 std::array "same perfprmance as plain (c-style) arrays
- What is unordered_set in C++
- 你如何理解"std: :forward is just syntactic sugar"?这是真的吗?
- C++ "error: use of overloaded operator '*' is ambiguous"似乎只有一场比赛
- C++ is calculating wrong
- 为什么"an inherited constructor is not a candidate for initialization from an expression of the same or
- Is clang++ ABI same as g++?
- Is stack.top().first() same as stack.top()?