2016-07-19 16 views
0

Ich bin die Vorlage Syntax des Formulars struct hash<template class Key> verwendet, aber was ist der Unterschied bei der Verwendung template <> struct hash<Key>?Vorlage Spezialisierung mit leeren Klammern und Struktur

namespace std { 

    template <> 
    struct hash<Key> 
    { 
    std::size_t operator()(const Key& k) const 
    { 
     .... 
    } 
    }; 
} 

Bitte beachten Sie, dass ich nach der Bedeutung von template <> habe zu suchen, und ich verstehe (ich hoffe), dass es einen Weg gibt, wenn passend mit Muster des nicht angepassten Fall zu spezifizieren, sondern zusammen mit der Verwendung von struct<Key> I verstehe die Motivation nicht.

+0

Das ist die Syntax für Template-Spezialisierung. – melpomene

+0

@melpomene Im Kontext von Strukturen/Klassen? Denn wenn ich eine Template-Funktion habe, würde ich sie nicht spezialisieren mit: template void foo() {} – user695652

+1

@ user695652 Das ist keine Spezialisierung, das ist nur eine normale Template-Deklaration. – 0x5453

Antwort

6

Es gibt verschiedene Ebenen von Template-Spezialisierung:

1) Template-Deklaration (keine Spezialisierung)

template <class Key, class Value> 
struct Foo {}; 

2) Partielle Spezialisierung

template <class Key> 
struct Foo<Key, int> {}; 

3) Full/explizite Spezialisierung

template <> 
struct Foo<std::string, int> {}; 

Dann, wenn die Vorlagen instanziiert wird, wird der Compiler die spezialisierteste Definition wählen zur Verfügung: als auch für Template-Funktionen

Foo<std::string, std::string> f1; // Should match #1 
Foo<int,   int>   f2; // Should match #2 
Foo<std::string, int>   f3; // Should match #3 

# 1 und # 3 zu arbeiten.

Verwandte Themen