【问题标题】:Template class expression parameter overloading模板类表达式参数重载
【发布时间】:2025-12-30 10:10:06
【问题描述】:

嘿,我想弄清楚是否可以用表达式参数“重载”模板类定义。有点像下面的 sn-p 代码。

template<class T>
class Test
{
public:
    T testvar;

    Test()
    {
        testvar = 5;
        cout << "Testvar: " << testvar << endl;
    }
};

template<class T>
class Test<T, int num>
{
public:
    T testvar;

    Test()
    {
        testvar = 10;

        cout << "Testvar: " << testvar << endl;
        cout << "Param: " << num << endl;
    }
};

谢谢。

编辑:为了记录,如果这不是很明显,我正在尝试用 C++ 来做到这一点...... :)

【问题讨论】:

    标签: c++ templates parameters overloading


    【解决方案1】:

    模板允许使用默认模板参数,这些参数可以提供类似于您正在寻找的内容..

    template<class T, int num = -1>
    class Test
    {
    public:
        T testvar;
    
        Test()
        {
            testvar = (num == -1 ? 10 : 5);
    
            cout << "Testvar: " << testvar << endl;
            if ( num != -1 )
                cout << "Param: " << num << endl;
        }
    };
    

    【讨论】:

    • 谢谢,这正是我想要的。
    【解决方案2】:

    如果您希望能够为Test 指定一个模板参数,则需要将默认模板参数声明为Shmoopty suggests

    也可以部分专门化不同的参数值:

    // This base template will be used whenever the second parameter is
    // supplied and is not -1.
    template<class T, int num = -1>
    class Test
    {
    public:
        T testvar;
    
        Test()
        {
            testvar = 10;
            cout << "Testvar: " << testvar << endl;
            cout << "Param: " << num << endl;
        }
    };
    
    // This partial specialisation will be chosen
    // when the second parameter is omitted (or is supplied as -1).
    template<class T, int num>
    class Test<T, -1>
    {
    public:
        T testvar;
    
        Test()
        {
            testvar = 5;
            cout << "Testvar: " << testvar << endl;
        }
    };
    

    这避免了ifswitch 语句的需要,这使得它稍微快了一点(不执行运行时测试),并允许以后以额外的部分专业化的形式“嫁接”额外的案例。 (尽管哪种方法更清晰是个人喜好的问题。)

    【讨论】: