在 C++ 中,创建一个验证某个类具有特定方法的概念,问题是该方法可以接受任意数量的参数

问题描述 投票:0回答:1

我正在尝试创建一个概念来验证类是否具有特定方法。该约束应仅检查具有此类名称的方法是否存在以及特定返回类型。它不应该对方法的参数施加约束。它可以接受任意数量的参数。

template< typename ExaminedType >
concept ConvertibleToStringObject = requires( ExaminedType instance )
{

    { instance.ToString( ... /* Accept arbitrary number of arguments */ ) } -> SameAs< std::string >;

};

有可能吗?

c++ metaprogramming c++20 template-meta-programming c++-concepts
1个回答
0
投票

假设你的

ToString
看起来像类似于

template<typename... Args>
std::string ToString(Args&&...) { return {};}

你可以写一个概念如下。

template<typename ClassT, typename... Args>
concept ConvertibleToStringObject = requires(ClassT instance, Args... args) {
    { instance.ToString(args...) } -> std::same_as<std::string>;
};

例如,您可以在模板函数中使用它

template<typename T, typename... Args>
    requires ConvertibleToStringObject<T, Args...>
void func(const T& instance, Args&&... args)
{
    // code ..
}

在 godbolt.org 观看现场演示

© www.soinside.com 2019 - 2024. All rights reserved.