只对一个类模板的一个方法进行专门化

问题描述 投票:0回答:1

我有一个类模板,对于所有可能的类型T1、T2都能正常工作。

template <typename T1, typename T2>
class Basic {
    int a;
    float b;

public:
    void foo(T1 t1, T2 t2) {
        // use a, b, t1, t2
    }
};

然而,有一种情况是当 T2char我希望 foo 要有不同的表现。

所以我试着专攻 只是 该方法。

template <typename T1>
class Basic<T1, char> {
    void foo(T1 t1, char t2) {
        // try using a, b, t1, t2 in a very special way

        // ERROR:
        // use of undeclared identifier: a
        // use of undeclared identifier: b
    }
};

问题是,模板类中可能有很多不同的数据成员和方法。Basic,不一定与函数 foo.

说到这里,我感觉全班人专职会很臃肿。有没有更好的解决方案?

c++ c++11 templates sfinae template-specialization
1个回答
1
投票

你可以使用 std::is_same 转而 fooT2char:

void foo(T1 t1, T2 t2) {
   if (std::is_same<T2, char>::value)
     std::cout << "char";
   else
     std::cout << "not char";
}

你不需要完全的专业技能 Basic 的,甚至是一个专门用于 foo.

这里有一个 演示.

从c++17开始,你甚至可以避免编译不需要的分支,(例如编译 charT2char,反之亦然),使用 if constexpr,像这样。

if constexpr (std::is_same<T2, char>())

这里有一个 演示.


1
投票

你可以用 std::is_same<T2, char>譬如 if (std::is_same<T2, char>::value)或者你可以使用标签调度,像这样。

public:
    void foo(T1 t1, T2 t2) {
        foo_impl(t1, t2, std::is_same<T2, char>{});
    }

private:
    void foo_impl(T1 t1, T2 t2, std::false_type) {
        std::cout << "T2 != char\n";
    }

    void foo_impl(T1 t1, T2 t2, std::true_type) {
        std::cout << "T2 == char\n";
    }

演示

© www.soinside.com 2019 - 2024. All rights reserved.