gpt4 book ai didi

c++ - 派生类的模板特化

转载 作者:IT老高 更新时间:2023-10-28 22:41:42 29 4
gpt4 key购买 nike

我有一个模板类(我无法修改),我们称之为 SomeClass ,我想专门研究仅从特定类派生的类。关注 this answer我能够在 gcc 6.3.1 中做到这一点,但不幸的是我需要在 gcc 4.9.2 中做到这一点,并且在编译时它失败了 “部分特化 SomeClass<T> 不专门化任何模板参数”

我有什么办法可以更改以下内容以使其与 gcc 4.9.2 一起使用?

#include <iostream>
#include <string>

using namespace std;

struct A {
string name() { return "A"; }
};

struct B : A {
string name() { return "B"; }
};

struct C {
string name() { return "C"; }
};

template<typename T, typename = std::enable_if_t<std::is_base_of<A, T>::value>>
using enable_if_a = T;

template<typename T>
struct SomeClass {
using Type = T;
};

template<typename T>
struct SomeClass<enable_if_a<T>>
{
using Type = A;
};

int main(int, char**)
{
SomeClass<A>::Type el1;
SomeClass<B>::Type el2;
SomeClass<C>::Type el3;

cout << el1.name() << "," << el2.name() << "," << el3.name() << endl;
}

输出:

A,A,C

最佳答案

有点做作,但这是一个至少可以工作的机器。
基本思想是hide A 并且不直接从它继承。相反,您可以严重依赖 mixins 并在检测器中组合一些类,您可以使用这些类专门化 SomeClass
缺点是像 B 这样的类变得更加深奥,我不确定它在一天结束时是否值得。直接特化可能更好。

话虽如此,下面是一个工作示例:

#include <iostream>
#include <string>
#include <utility>

using namespace std;

class ADerivedFactory {
struct A {
string name() { return "A"; }
};

template<typename T>
struct Detector: T { using type = A; };

public:
template<template<typename> class C>
using type = Detector<C<A>>;
};

template<typename T>
struct AT : T {};

template<typename T>
struct BT : T {
string name() { return "B"; }
};

using A = ADerivedFactory::type<AT>;
using B = ADerivedFactory::type<BT>;

struct C {
string name() { return "C"; }
};

template<typename T>
struct SomeClass {
using Type = T;
};

template<template<typename> class C>
struct SomeClass<ADerivedFactory::type<C>>
{
using Type = typename ADerivedFactory::type<C>::type;
};

int main(int, char**)
{
SomeClass<A>::Type el1;
SomeClass<B>::Type el2;
SomeClass<C>::Type el3;

cout << el1.name() << "," << el2.name() << "," << el3.name() << endl;
}

wandbox 上查看并运行它.

关于c++ - 派生类的模板特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45679416/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com