gpt4 book ai didi

c++ - 我可以在不编写自定义特征类的情况下对类型进行模式匹配吗?

转载 作者:可可西里 更新时间:2023-11-01 18:28:55 27 4
gpt4 key购买 nike

由于 C++20 概念尚未标准化,我使用 static_assert 作为临时概念检查,以便在不满足类型要求时提供有用的错误消息。在这种特殊情况下,我有一个函数要求在获取结果类型之前可以调用类型:

template <typename F, typename... Args>
void example() {
static_assert(std::is_invocable_v<F, Args...>, "Function must be callable");
using R = std::invoke_result_t<F, Args...>;

// ...
}

另外,我要求可调用的结果必须是某种std::optional,但我不知道可选的类型是什么,所以我需要从它:

using R = // ...
using T = typename R::value_type; // std::optional defines a value_type

但是,如果类型 R 没有 value_type,这将失败,例如如果它不是预期的 std::optional。我想要一个 static_assert 来首先检查它,如果断言失败,还有另一个不错的错误消息。

我可以用 std::is_same_v 之类的东西检查确切的类型,但在这种情况下我不知道确切的类型。我想检查 Rstd::optional一些实例,而不指定它必须是哪个实例.

一种方法是使用辅助特征:

template <typename T>
struct is_optional { static constexpr bool value = false; };

template <typename T>
struct is_optional<std::optional<T>> { static constexpr bool value = true; };

template <typename T>
constexpr bool is_optional_v = is_optional<T>::value;

...然后我可以写:

static_assert(is_optional_v<R>, "Function's result must be an optional");

这行得通,但是仅仅为了像这样的一次性检查而用辅助特征污染我的命名空间似乎有点尴尬。我不希望在其他任何地方都需要 is_optional,尽管我可以想象可能会以其他一次性特征结束,例如 is_variantis_pair .

所以我想知道:是否有更简洁的方法来做到这一点?我可以在 std::optional 的实例上进行模式匹配而不必定义is_optional 特性及其偏特化?

最佳答案

根据几位回答者的建议,我做了一个可复用的trait:

template <typename T, template <typename...> typename Tpl>
struct is_template_instance : std::false_type { };

template <template <typename...> typename Tpl, typename... Args>
struct is_template_instance<Tpl<Args...>, Tpl> : std::true_type { };

template <typename T, template <typename...> typename Tpl>
constexpr bool is_template_instance_v = is_template_instance<T, Tpl>::value;

……这样我就可以写:

static_assert(is_template_instance_v<R, std::optional>, "Function's result must be an optional");

这与 is_optional 特性一样多行和声明,但它不再是一次性的;我可以使用相同的特征来检查其他类型的模板(如变体和对)。所以现在它感觉像是对我的项目的有用补充,而不是杂乱无章。

关于c++ - 我可以在不编写自定义特征类的情况下对类型进行模式匹配吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56815314/

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