首页 > 解决方案 > 如何decltype模板方法C++?

问题描述

我通过实现验证的概念编写接口。

传统方法没有问题:

// Interface realization
struct Realization
{
    int* TestMethod(const std::string& aStr)
    {
        return (int *) aStr.c_str();
    }
};

// Concept
template <typename T>
concept IRealization = std::is_same_v<decltype(&T::TestMethod), int* (T::*)(const std::string&)>;

// and then, for example
void Check()
{
    static_assert(IRealization<Realization>)
}

但是当我尝试为模板方法编写类似的检查时:

// Interface realization
struct Realization
{
    template <typename T>
    int* TemplateMethod(const T& aStr)
    {
        return (int *) aStr.c_str();
    }
};

,我遇到了一个模板方法的dectype问题,因为我不会写

decltype(&RealizationImpl::TemplateMethod)

(查看接口时,不知道要替换的类型)

请告诉我,我能否以某种方式获得没有类型的模板函数的签名,或者以其他方式解决我的问题?谢谢!

标签: c++templatestemplate-meta-programmingc++20c++-concepts

解决方案


你不应该写这样的概念。一个概念永远不应该检查像具有精确签名的成员函数这样具体的东西。相反,一个概念应该说,给定所讨论类型的实例,我应该能够做到,参数列表i.memberFunc(...)在哪里。...

例如,您的“IRealization”概念(请不要在概念前加上I. 概念不是接口)应该说“T必须有一个可以在给定std::string参数的情况下调用的成员函数,并产生可转换为 . 的东西int。” 那看起来像:

template <typename T>
concept IRealization = requires(T t, std::string str)
{
  { t.TestMethod(str) } -> convertible_to<int>;
};

这允许用户提供一个TestMethod,例如,std::string_view而不是std::string. 对类型进行如此难以置信的限制是没有意义的。

检查是否T具有可使用某种类型调用的成员函数的概念必须在和U上进行模板化:TU

template <typename T, typename U>
concept IRealization = requires(T t, U u)
{
  { t.TestMethod(u) } -> convertible_to<int>;
};

推荐阅读