假设我们有一些转换例程类。如果我们可以从 T
类转换为 U
,我们可以自动转换反之亦然。
我用一个模板类和一些特化来表示它:
template <typename T, typename U>
class Convert;
template <>
class Convert<A,B> {
static int param() { return 42; }
}
template <>
class Convert<B,A> {
static int param() { return -Convert<A,B>::param(); }
}
这很好用,但是当我们需要为例程添加新类型时,我们必须添加 2 个特化。 我们可以通过像这样定义一些通用的反向模板类来将这个数字减少到 1 吗:
template <typename T, typename U>
class Convert {
static int param() { return -Convert<U,T>::param(); }
}
如果我们已经拥有 Convert 特化,这可能行得通吗?
提前致谢。
最佳答案
以下是我在评论中提出的建议:
#include<iostream>
#include<type_traits>
struct A{};
struct B{};
struct C{};
template <typename ... Args>
struct Convert;
template <typename T>
struct Convert<T,T> {
static int param() { return 0; }
};
template <typename T, typename U>
struct Convert<T,U> {
static decltype(-Convert<U,T>::param()) param() { return -Convert<U,T>::param(); }
};
template <>
struct Convert<A,B> {
static int param() { return 42; }
};
template <>
struct Convert<A,C> {
static int param() { return 43; }
};
template <>
struct Convert<B,C> {
static int param() { return 44; }
};
int main()
{
std::cout<<Convert<A,B>::param()<<std::endl;
std::cout<<Convert<B,A>::param()<<std::endl;
std::cout<<Convert<A,C>::param()<<std::endl;
std::cout<<Convert<C,A>::param()<<std::endl;
std::cout<<Convert<B,C>::param()<<std::endl;
std::cout<<Convert<C,B>::param()<<std::endl;
Convert<int,double>::param();
}
想法是先给出一个通用声明,然后首先指定模板参数相等(应该给出零)的情况以及它们不同的情况,在这种情况下返回转换后的参数。
接下来,对于 n
类,您需要为所有 n*(n-1)/2
Convert
类提供特化. (如果需要,可以通过推导等方式进一步简化)。
关于c++ - 对称模板的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27012837/