2011-10-31 69 views
0

我使用模板我的結構等:大小的數組如在C++函數的參數類型

#pragma pack(push, 1) 
template <typename T> 
struct S 
{ 
    T t; 

    inline void Set(const T& val) { t = val; } 
} 
#pragma pack(pop) 

T可以是一個浮子,整型,短或炭[10],炭[1]或焦[2 ](最好是任何長度都會很大)。

雖然上面似乎很好地工作,爲整型,我在實施中的字符[N]部分困難:

  1. 我需要使用函數strncpy或memcpy的,而不是賦值運算符
  2. 使用上面,編譯器抱怨簽名(const char [2] & val),我通過s.Set(「T」)調用它。
  3. S與積分和字符類型之間的接口必須與它調用它們的通用代碼相同(並且它不關心它們是什麼類型)。
+0

爲什麼'的char []'s且不'的std :: string's?你不會有這些問題。 – Mat

+0

@Mat它被用在包裝結構的上下文中,直接放在線上,而std :: string不會爲此而遺憾地工作。 – chriskirk

+0

你仍然可以使用'std :: string'作爲你的'Set'方法。 – Mat

回答

4

您可以在char[10]的情況下定義模板T,等你什麼時候做的任何問題依然?但正如馬特已經指出的那樣,使用字符串是一種值得考慮的方法。

#include <iostream> 

#pragma pack(push, 1) 
template <typename T> 
struct S 
{ 
    T t; 

    inline void Set(const T& val) { std::cout << "general\n"; } 
}; 

template <int len> 
struct S<char[len]> 
{ 
    char t[len]; 

    inline void Set(const std::string& val) { std::cout << "specialization\n"; } 
}; 
#pragma pack(pop) 

int main() { 

    S<int> a; 
    a.Set(10); 

    S<char[20]> b; 
    b.Set("turkey!"); 

    return 0; 
} 

http://codepad.org/X8YVuFja輸出:

一般
專業化

+0

我想我的問題是與C + +模板語法比概念更多。你願意提供一個這樣的專業化的例子嗎? – chriskirk

+0

@chriskirk:專業化有效地歸結爲爲整型類型編寫一次類,以及爲char數組編寫一次。這是可以避免的,但也可以讓事情變得更容易。 –

+0

@MooingDuck是否有可能在方法簽名中爲所有類型爲char [n]的特化設置了std :: string?我認爲從最終用戶的角度來看,這會更方便一些。 – chriskirk

0

正常工作對我來說:http://codepad.org/03FSqZC6

#pragma pack(push, 1) 
template <typename T> 
struct S 
{ 
    T t; 

    inline void Set(const T& val) {} 
}; 
#pragma pack(pop) 

int main() { 
    typedef char (carray)[10]; //do you have a line like this? 
    S<carray> lhs; 
    carray rhs = "HELLO"; 
    lhs.Set(rhs); 
    return 0; 
} 

最有可能你的問題是用u引起唱不正確的數組類型。查看我的代碼,瞭解正確的typedef示例。

編輯:

我才意識到這將成爲一個痛苦的叫Set如果你已經有了一個std::string或動態數組任何類型的。做模板專業化。

+0

有趣的做法。我沒有按照您所描述的方式使用typedef。 – chriskirk

+1

typedefs使數組和指針更容易。使用它們。 :D –

+0

你確定這是做你認爲它做的嗎? –

2

好了,局部特殊化可能做的伎倆:

template <typename T> struct S 
{ 
    T x; 
    void set(const T & y) { x = y; } 
}; 

template <typename T, unsigned int N> struct S<T[N]> 
{ 
    T x[N]; 
    void set(const T (&y)[N]) { std::copy(y, y + N, x); } 
}; 

用法:

S<char[10]> b; 
char c[10] = "Hello"; 
b.set(c);