仅特化 class 模板的一种方法

Specializing only one method of a class template

我有一个 class 模板,它适用于所有可能的类型 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
    }
};

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

话虽这么说,但我觉得完全 class 专业化会有点臃肿。有更好的解决方案吗?

T2char 时,您可以使用 std::is_samefoo 中做其他事情:

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

为此,您不需要 Basic 的完全专业化,甚至不需要 foo.

的专业化

这是一个 demo

从 c++17 开始,您甚至可以避免编译不需要的分支,(即仅当 T2char 时才编译 char 分支,反之亦然反之亦然),使用 if constexpr,像这样:

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

这是一个 demo

您可以使用 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";
    }

Demo