我正在使用一個使用 UCSD 字串的 Pascal 庫。我創建了這個模板結構,以便更輕松地使用它們:
template <std::size_t N>
struct DString {
unsigned Reference, Size = N;
char String[N];
};
#define MAKE_STRING(X) DString<sizeof(X)>{ 0x0FFFFFFFF, sizeof(X) - 1, X}
auto foo = MAKE_STRING("Foo");
我知道它不包括 WideChar 案例,但圖書館一開始也不包括,所以我在這方面是安全的。
無論如何,我的問題是我不想使用宏,而是想創建一個建構式。所以我想知道 C 是否提供了實作類似這樣的偽代碼的可能性:
template <std::size_t N>
struct DString {
unsigned Reference, Size = N;
char String[N];
DString<sizeof(s)>(const char* s, unsigned r = 0x0FFFFFFFF):
String(s), Reference(r) {}
};
auto foo = DString("Foo");
當然,它不需要是“建構式”。這只是一個例子。
我也試過這個:
template <std::size_t N>
struct DString {
unsigned Reference, Size = N;
char String[N];
inline static DString build(const char* X) {
return DString<sizeof(X)>{ 0x0FFFFFFFF, sizeof(X) - 1, X};
}
};
auto foo = DString::build("Foo");
但這本身就代表了另一個問題。因為現在我不能從 DString 參考靜態函式而不做DString< size >::build(...);.
在這種情況下我能做什么?
uj5u.com熱心網友回復:
如果您至少可以使用 C 17... 使用委托建構式和 CTAD...
您可以添加DString一個額外的模板建構式(也許private),否則您不能直接char[]用 a 初始化 achar const *
template <std::size_t ... Is>
DString (std::index_sequence<Is...>, char const * s, unsigned r)
: Reference{r}, Size{N}, String{ s[Is]... }
{ }
接下來,您必須從舊的建構式中呼叫新的建構式
DString (char const * s, unsigned r = 0x0FFFFFFFFu):
DString(std::make_index_sequence<N>{}, s, r)
{ }
最后,您必須添加一個明確的演繹指南(假設您想要DString<3>從char const [4]
template <std::size_t N>
DString (char const (&)[N], unsigned = 0u) -> DString<N-1u>;
并且自動扣除作業。
下面是一個完整的編譯示例
#include <utility>
#include <iostream>
template <std::size_t N>
struct DString {
private:
template <std::size_t ... Is>
DString (std::index_sequence<Is...>, char const * s, unsigned r)
: Reference{r}, Size{N}, String{ s[Is]... }
{ }
public:
unsigned Reference, Size = N;
char String[N];
DString (char const * s, unsigned r = 0x0FFFFFFFFu):
DString(std::make_index_sequence<N>{}, s, r)
{ }
};
template <std::size_t N>
DString (char const (&)[N], unsigned = 0u) -> DString<N-1u>;
int main()
{
auto foo = DString{"Foo"};
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/428002.html
