使用另一个模板

时间:2015-07-19 11:37:01

标签: c++ templates

我有一个模板结构:

template<typename T>
struct A {...};

我想专注于其他模板类型B

但是,我希望此专业化适用于Bconst B版本。有可能吗?

我已经尝试过这种方法:

template<typename T, typename Enable = void>
struct A {...};

template<typename T, typename U>
struct A<T, std::enable_if<std::is_same<T, B<U>>::value || std::is_same<T, const B<U>>::value, void>::type
{
...
}

但它无法编译,给我error: template parameters not deducible in partial specialization

3 个答案:

答案 0 :(得分:2)

您可以为document.write(motorbike.Wheel());创建特征并使用它:

is_B

Live Demo

答案 1 :(得分:1)

#include <type_traits>

template <typename T>
struct B {};

template <typename T>
struct is_b : std::false_type {};

template <typename T>
struct is_b<B<T>> : std::true_type {};

template <typename T>
struct is_b<const B<T>> : std::true_type {};

template <typename T, typename Enable = void>
struct A {};

template <typename T>
struct A<T, typename std::enable_if<is_b<T>{}>::type> {};

DEMO

答案 2 :(得分:0)

我从评论中得出了我的建议。该解决方案不使用SFINAE或其他TMP技术。它比其他建议稍微简单一些,所以我希望我没有误解这个问题。

我们的想法是,您只需要专注两次,包括B<T>B<T> const案例。为了避免必须两次实现该类,您只需从const-version派生非const版本(以保持const-correctness)。

#include <iostream>

template <typename T>
struct B {};

template <typename T>
struct A
{
    void foo() { std::cout << "Generic A\n"; }
};

template <typename T>
struct A<B<T> const>
{
    // insert specialized functionality here
    void foo() { std::cout << "B specialization\n"; }
};

template <typename T>
struct A<B<T>>: public A<B<T> const>
{};


int main()
{
    A<int>().foo(); // Generic A
    A<B<int>>().foo(); // B specialization
    A<B<int> const>().foo(); // B specialization
}

它假定您需要两个特化(非const和const)的相同实现。