gpt4 book ai didi

c++ - 做一个静态断言模板类型是另一个模板

转载 作者:IT老高 更新时间:2023-10-28 22:25:06 27 4
gpt4 key购买 nike

我如何static_assert 像这样?如果不是 C++ 或 C++11 中的新功能,也许 Boost 支持它?

template<T>
struct foo {};

template<FooType>
struct bar {
static_assert(FooType is indeed foo<T> for some T,"failure"); //how?
};

最佳答案

你可以按照这些思路做一些事情。给定一个可以验证类是否是类模板的实例化的特征:

#include <type_traits>

template<typename T, template<typename> class TT>
struct is_instantiation_of : std::false_type { };

template<typename T, template<typename> class TT>
struct is_instantiation_of<TT<T>, TT> : std::true_type { };

在你的程序中如下使用它:

template<typename T>
struct foo {};

template<typename FooType>
struct bar {
static_assert(is_instantiation_of<FooType, foo>::value, "failure");
};

int main()
{
bar<int> b; // ERROR!
bar<foo<int>> b; // OK!
}

如果您愿意,可以将其概括为检测一个类是否是具有任意数量(类型)参数的模板的实例,如下所示:

#include <type_traits>

template<template<typename...> class TT, typename T>
struct is_instantiation_of : std::false_type { };

template<template<typename...> class TT, typename... Ts>
struct is_instantiation_of<TT, TT<Ts...>> : std::true_type { };

template<typename FooType>
struct bar {
static_assert(is_instantiation_of<foo, FooType>::value, "failure");
};

然后你会在你的程序中这样使用它:

template<typename FooType>
struct bar {
static_assert(is_instantiation_of<foo, FooType>::value, "failure");
};

int main()
{
bar<int> b; // ERROR!
bar<foo<int>> b; // OK!
}

这里是 live example .

关于c++ - 做一个静态断言模板类型是另一个模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17390605/

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