混合显式类专业化和类方法专业化?

时间:2016-04-25 20:36:46

标签: c++ templates

所以我有一个类想要实例化两个类中的一个。我在标题中声明它:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.hinttest.MainActivity"
    >
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"/>
    <android.support.design.widget.TextInputLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textColorHint="#000000">
        <android.support.v7.widget.AppCompatEditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="Title"
            android:textColor="#000000"/>
    </android.support.design.widget.TextInputLayout>
    <android.support.design.widget.TextInputLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textColorHint="#000000">
        <android.support.v7.widget.AppCompatEditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="Title"
            android:textColor="#000000"/>
    </android.support.design.widget.TextInputLayout>
</LinearLayout>

由于我不想将方法定义放在标题中,而是将它们放在实现文件中,然后执行显式特化。尽管可以使用模板一般性地定义template <class T> class MyClass { public: bool DoSomethingGeneric(); bool DoSomethingTSpecific(); }; 方法,但DoSomethingGeneric需要两个单独的实现,一个用于我想要实例化的两个可能的类DoSomethingTSpecific

MyClass

现在,谜语我:我在哪里放置显式专业化?如果我将它放在我的模板定义之后(就像我通常使用纯泛型类的特化),clang说:

template <class T>
bool MyClass<T>::DoSomethingGeneric() {
  // Generic code
}

template <>
bool MyClass<ClassA>::DoSomethingTSpecific() {
  // ClassA-specific implementation
}

template <>
bool MyClass<ClassB>::DoSomethingTSpecific() {
  // ClassB-specific implementation
}

此消息附带指向定义explicit specialization of 'MyClass<ClassA>' after instantiation 的行的指针。这是有道理的。我的理解是DoSomethingTSpecific方法的显式特化被视为隐式特化。

同时,如果我在所有模板定义之后放置特化,我会看到:

DoSomethingTSpecific

这对我来说是个谜。

有什么想法?如何才能有明确的类级别专门化和显式方法专门化?

1 个答案:

答案 0 :(得分:1)

来自C ++标准§14.7.3(5)明确专业化 强调我的):

  

明确专门的类模板的成员是   以与普通类成员相同的方式定义,不使用template<>语法

示例:

template <> // specialization for classA
class MyClass<ClassA> {
public:
    bool DoSomethingTSpecific(); // must be declared here
};

// template<> is not used here
bool MyClass<ClassA>::DoSomethingTSpecific() {
  // ClassA-specific implementation
}

演示:

http://cpp.sh/3tc2g