c++ - 对称模板的参数

标签 c++ templates template-specialization

假设我们有一些转换例程类。如果我们可以从 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/

相关文章:

c++ - 在函数返回与模板参数相同的情况下,如何将函数作为模板参数传递?

c++ - Lambda 函数模板转换失败

c++ - 模板特化和模板模板参数的问题

c++ - '仅将成员函数添加到类的专用模板

c++ - 为什么 waveOutWrite() 会在调试堆中导致异常?

c++ - 客户端到客户端套接字通信

c++ - 测试内联(模板化)函数的返回值(它本身正在测试)是否针对一次测试进行了优化?

c++ - 成员模板变量特化

c++ - C++ OpenCV 中的 cvPtr2D 等价物

c++ - const 和非 const 模板特化