我有一个模板结构:
template<typename T>
struct A {...};
我想专注于其他模板类型B
。
但是,我希望此专业化适用于B
和const 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
答案 0 :(得分:2)
答案 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> {};
答案 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)的相同实现。