2013-07-11 39 views
2

是否可以創建一個字符串作爲模板參數,以及如何?像是否可以將字符串作爲模板參數?

A<"Okay"> is a type. 

任何字符串(std :: string或c-string)都可以。

+1

是的,但由於它不表現爲你會想到它是不是非常有幫助的(它使用指針平等,不串平等)。 –

+0

那麼......你可能會做一個可變模板,將一堆字符作爲模板輸入。至少它會給你真正的字符串等價。 'std :: string'將不起作用,因爲模板參數必須是[整數](http://home.roadrunner.com/~hinnant/TypeHiearchy.pdf)類型。 – Suedocode

+0

[字符串作爲模板參數?]可能重複(http://stackoverflow.com/questions/1826464/strings-as-template-arguments)。另請參見[非類型模板參數](http://stackoverflow.com/questions/5687540/non-type-template-parameters) –

回答

2

是的,但你需要把它放在一個外部鏈接的變量中(或者C++ 11是否取消了外部鏈接的要求)。 基本上,給出:

template <char const* str> 
class A { /* ... */ }; 

這樣的:

extern char const okay[] = "Okay"; 

A<okay> ... 

作品。注意認爲這是字符串 它定義獨特的內容,但對象本身:

extern char const okay1[] = "Okay"; 
extern char const okay2[] = "Okay"; 

鑑於此,A<okay1>A<okay2>有不同的類型。

1

這裏有一個方法,使字符串的內容確定唯一性

#include <windows.h> //for Sleep() 
#include <iostream> 
#include <string> 

using namespace std; 

template<char... str> 
struct TemplateString{ 
    static const int n = sizeof...(str); 
    string get() const { 
     char cstr[n+1] = {str...}; //doesn't automatically null terminate, hence n+1 instead of just n 
     cstr[n] = '\0'; //and our little null terminate 
     return string(cstr); 
    } 
}; 

int main(){ 
    TemplateString<'O','k','a','y'> okay; 
    TemplateString<'N','o','t',' ','o','k','a','y'> notokay; 
    cout << okay.get() << " vs " << notokay.get() << endl; 
    cout << "Same class: " << (typeid(okay)==typeid(notokay)) << endl; 
    Sleep(3000); //Windows & Visual Studio, sry 
} 
相關問題