【问题标题】:Is it possible to determine if class has template method of certain signature是否可以确定类是否具有特定签名的模板方法
【发布时间】:2021-12-29 17:26:38
【问题描述】:

我知道可以通过 SFINAE 确定类是否具有某些成员。但是有没有办法确定类是否有特定的模板方法?例如:

class Foo {
public:
    template<typename T>
    int method(std::vector<T> vec);
};

我还知道您可以检测成员模板的特定实例化(即针对指定的T)。但我想知道 arbitrary T987654323@ 是否有可能这样做?

编辑:

更准确地说,为什么我需要 T任意 类型考虑示例:

class Foo {
public:
    template<typename Derived>
    void func(Eigen::ArrayBase<Derived> &&arr)
    {
        // implementation 
    }
};

using Matrix = Eigen::Array<double, -1, -1, Eigen::RowMajor>;

Matrix m1(10, 10);

Foo foo;

foo.func(m1.row(1));
foo.func(m1.col(1));
foo.func(m1.row(2).segment(2, 4));

func 可以使用这些表达式中的任何一个来调用,但是这些调用中的Derived 会有所不同:

  1. Eigen::Block<:array>, 1, -1, true>
  2. Eigen::Block<:array>, -1, 1, false>
  3. Eigen::Block<:block>, 1, -1, true>, 1, -1, false>

【问题讨论】:

  • 为什么要知道是不是模板化方法?通常你只对它的特定实例感兴趣,所以你可以检查是否有一个名为 method() 的成员将 std::vector&lt;DesiredType&gt; 作为参数。
  • 我不认为这是可能的:模板函数可以有条件地禁用模板函数的某些实例,那么如果int被允许为T,你期望结果是什么,但不是unsigned int?
  • @G.Sliepen 有问题的方法没有std::vector&lt;T&gt; 作为参数,而是Eigen::ArrayBase&lt;Derived&gt;。这个Derived 类型不能确定,例如它可以有一些表达式类型(比如在表达式模板中),或者只是数组类型。
  • @G.Sliepen 我不知道它是否会有所帮助,但我添加了一个编辑,希望可以让事情更清楚。
  • 很抱歉我没有写得更详细:func() 是一个需要在某个类中检查是否存在的方法。

标签: c++ templates template-meta-programming


【解决方案1】:

在 C++20 中,这可以通过我认为的约束/概念来完成。 https://en.cppreference.com/w/cpp/language/constraints 看看这样的事情是否有效:

template<typename T1, typename T2>
concept Methodable = requires (T1 x) {
    std::vector<T2> v; x.method<T2>(v);
};

我没有对此进行测试,但这可能工作得很好。 我目前的设备上没有方便的编译器来测试这样的东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-09
    • 1970-01-01
    • 2022-01-22
    • 2015-06-07
    • 1970-01-01
    • 1970-01-01
    • 2022-12-12
    相关资源
    最近更新 更多