5

一些常见的模板专业化是这样的:

template<class T>
class C
{
    void common() { ... }
    void f2 = delete;
};

template<>
class C<int>
{
    void common() { ... }
    void f1() { ... }
};

可以表示static_if为:

template<class T>
class C
{
    void common() { ... }

    static_if(std::is_same<T, int>::value)
    {
        void f1( ) { ... }
    }
    else
    {
        void f2( ) = delete;
    }
}

这些是直接竞争的功能吗?模板专业化可以做一些static_if不能做的事情吗?似乎static_if可以做模板专业化可以做的所有事情,甚至更多。

顺便说一句:我不太喜欢static_if这种情况,因为它可能使您在任何给定情况下都可以使用界面的哪些部分并不明显。也许模板专业化在某些情况下仍然提供更清晰的语法。

4

6 回答 6

10

static if不会为您做的一件事是使用模板专业化的“主要”方式 - 在一个地方提供通用行为并让您的代码用户覆盖(=专门化)它以满足他们的特定需求/数据类型/等。 ..

于 2012-08-22T20:56:04.103 回答
4

不,static_if 不会弃用显式模板特化。显式模板专业化是比 static_if 更强大的功能,提供了许多 static_if 不打算提供的功能。static_if 只是表达某些事物的更方便和可读的方式。

static_if 不能做某些显式模板专业化可以做的事情,例如更改类继承的基类。

struct S {};

template<typename T>
struct T
  static_if(is_same<T,int>::value) { : S }  // ?
{ };

template<typename T>
struct T {};

template<>
struct T<int> : S {};
于 2012-08-22T21:11:02.417 回答
2

Ifs是关于分支的;专业化是关于匹配的。有时一个比另一个更好。

这是直接来自 Alexandrescu 的Modern C++ Design第 11.9 节“多方法”的示例:假设您有一个基于 的复杂类层次结构Shape,具有虚拟和非虚拟继承。您希望能够尽可能高效地在层次结构的成员之间进行转换。由于虚拟基地需要dynamic_cast,我们必须允许这样做,但我们也希望static_cast尽可能地这样做。通过演员政策的解决方案:

template <typename To, typename From> struct ShapeCaster
{ 
    static To & cast(From & x) { return dynamic_cast<To&>(x); }
};

template <> struct ShapeCaster<Triangle, Shape>
{
    static Triangle & cast(Shape & x) { return static_cast<Triangle&>(x); }
};

template <typename To, typename From> To & shape_cast(From & x)
{
    return ShapeCaster<To, From>::cast(x);
}

现在无论你在你的层次结构中移动,你可以说

To & y = shape_cast<To>::cast(x);

你得到最有效的演员表,并且可以轻松扩展策略。

用一系列ifs 写这个会更难阅读。

于 2012-08-22T21:07:17.163 回答
1

static if功能甚至还没有成为标准。现在,假设相关问题得到解决并成为标准,并且所有编译器都支持它,那么它将只是工具集中的一个工具。

我可以想象不同的情况,专业化会使代码更具可读性/可维护性,在所有这些情况下,专业化仍然是要走的路。请注意,最大的优势static if是您可以交错来自不同专业化的代码,但这也可能是一个劣势,因为您可能最终会得到大量有条件地编译/忽略的代码,而不是多个简单的专业化。

于 2012-08-22T20:41:32.643 回答
0

我相信是的。static_if比模板特化强大得多,尤其是当您需要特化类的一小部分而不是整个定义时。专业化更好的唯一情况 - 当您的专业化实现与主模板/其他专业化完全不同时。

于 2012-08-22T20:44:21.753 回答
0

不考虑偏好,的,当它可以使用另一个模板专业化时!

众所周知:std::is_same<T, int>::value 本身就是模板特化!

我不确定,但我认为它的实现方式如下:

template<typename, typename>
struct is_same{
    static constexpr bool value = false;;
};
 template<typename T>
struct is_same<T, T>{
    static constexpr bool value = true;;
};

真正的问题是,最终是否会有一种无需模板专门化的类型/类比较方法?也许只有这样才不需要模板专业化!

于 2019-05-18T12:35:34.723 回答