我仍在处理我在几个小时前发布的问题:
[How to overload/specialize template class function to handle arithmetic types and a container-class
我试图实现此解决方案。它可以编译,但是对象是用DerivedClass-Constructor而不是部分专用模板类DerivedClass
template <typename T> class BaseClass
{
protected:
T mem;
public:
BaseClass(T arg) : mem(arg){};
};
template <typename T> class DerivedClass : public BaseClass<T>
{
public:
DerivedClass(T arg): BaseClass<T>(arg){};
};
template <typename T>
class DerivedClass<Eigen::ArrayBase<T> >
: public DerivedClass<Eigen::ArrayBase<T> >
{
public:
DerivedClass(Eigen::ArrayBase<T> arg):BaseClass<Eigen::ArrayBase<T> >(arg){};
};
int main
{
...
Eigen::Array3d arg = Array3d::Random(3);
DerivedClass<Eigen::Array3d> o(arg);
....
}
答案 0 :(得分:1)
如果Eigen::Array3d
是某些using
的别名(通过typedef
的别名(通过Eigen::ArrayBase<T>
或T
),则您的代码应该可以使用。
但是我想Eigen::Array3d
继承自Eigen::ArrayBase<T>
。所以不是``Eigen :: ArrayBase`,所以不匹配部分专业化,所以匹配了主模板。
如果您想要一个特殊化来拦截从Eigen::ArrayBase
派生的所有类,则可能的解决方案是添加一个带有默认值的附加模板参数,并激活T
仅从某个{{1 }}。
以下内容(警告:代码未经测试)
Eigen::ArrayBase
答案 1 :(得分:1)
template<template<class...>class Z>
struct template_instance_test {
static std::false_type test(...);
template<class...Ts>
static std::true_type test( Z<Ts...> const* );
template<class X>
using tester = decltype(test( std::declval<X*>() ) );
};
template<template<class...>class Z, class T>
using is_derived_from_template = typename template_instance_test<Z>::template tester<T>;
我们现在可以询问某物是特定模板的实例,还是源自特定模板的实例。
template<class X>
struct Base {};
template<class X>
struct Derived:Base<X> {};
template<class T>
struct Storage {
T data;
};
template<class T, class=void>
struct Instance:Storage<T> {
enum {is_special = false};
};
template<class T>
struct Instance<T, std::enable_if_t< is_derived_from_template<Base, T>{} > >:
Storage<T> {
enum { is_special = true };
};
int main() {
Instance<int> i; (void)i;
static_assert(!Instance<int>::is_special);
Instance<Derived<int>> j; (void)j;
static_assert(is_derived_from_template<Base, Base<int>>{});
static_assert(is_derived_from_template<Base, Derived<int>>{});
static_assert(Instance<Derived<int>>::is_special);
}
我们完成了。 Live example。