【发布时间】: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 会有所不同:
- Eigen::Block<:array>, 1, -1, true>
- Eigen::Block<:array>, -1, 1, false>
- Eigen::Block<:block>, 1, -1, true>, 1, -1, false>
【问题讨论】:
-
为什么要知道是不是模板化方法?通常你只对它的特定实例感兴趣,所以你可以检查是否有一个名为
method()的成员将std::vector<DesiredType>作为参数。 -
我不认为这是可能的:模板函数可以有条件地禁用模板函数的某些实例,那么如果
int被允许为T,你期望结果是什么,但不是unsigned int? -
@G.Sliepen 有问题的方法没有
std::vector<T>作为参数,而是Eigen::ArrayBase<Derived>。这个Derived类型不能确定,例如它可以有一些表达式类型(比如在表达式模板中),或者只是数组类型。 -
@G.Sliepen 我不知道它是否会有所帮助,但我添加了一个编辑,希望可以让事情更清楚。
-
很抱歉我没有写得更详细:
func()是一个需要在某个类中检查是否存在的方法。
标签: c++ templates template-meta-programming