我有一些舊代碼使用非常類似於str_const
描述的here和here來執行一些constexpr字符串操作。 str_const
是Scott Schurr描述的一種文字類型,可以從字符串文字構造,因爲它具有const char (&)[]
的模板構造函數。將`hana :: string`轉換爲`constexpr const char(&)[]`
我現在也有一些使用boost::hana
的新代碼。
我希望能夠採取hana::string
並創建一個引用它的str_const
。最簡單的方法是將hana::string
轉換爲constexpr const char (&)[]
。 (實際上,在這一點上,這不是最簡單的方法,最簡單的方法當然是爲我的str_const
實現添加一個新的模板構造函數。但是在這一點上,這個問題已經發生在它自己的生活中,我主要關心的是這可以用hana::string
來完成。所以,讓我們假設我不能改變str_const
執行。)
然而,在hana
docs的方式hana::string
轉換爲運行時字符串是hana::to<const char *>
。
樂觀地說,我嘗試過各種形式的hana::to<const char (&)[hana::length(...)]> (...)
,但這會導致hana
中的靜態斷言失敗。
hana
文檔建議的其他選項是使用hana::unpack
,然後將這些字符粘貼到數組中。我寫了這個代碼
template <typename T, size_t N>
struct array {
T arr[N];
};
struct char_packer {
template <typename... Ts>
constexpr auto operator()(Ts... ts) -> array<const char, sizeof...(ts) + 1> {
return array<const char, sizeof...(ts) + 1>{{ ts... , 0 }};
}
};
template <typename S>
struct string_keeper {
static constexpr auto my_array = hana::unpack(S{}, char_packer{});
};
template <int N>
using char_arr = const char [N];
template <typename S>
constexpr auto to_string_literal(S &&) -> const char_arr<decltype(hana::length(S{}))::value + 1> & {
return string_keeper<S>::my_array.arr;
}
我覺得這幾乎可以工作,至少它編譯。但是,如果引用也在運行時使用,那麼它將失敗並顯示鏈接器錯誤:undefined reference to ... string_keeper<boost::hana::string<(char)97> >::my_array
。
(其實我覺得我明白爲什麼這是一個ODR的問題,如果我認爲它的時間長一點,我可能還記得如何解決它...不知道...)
憑直覺,我覺得有必須是一種方法來做到這一點。因爲,hana
已經允許我將hana::string
轉換爲constexpr const char *
,其中指針正好指向我想要的數組。事實上,它甚至表明,在我嘗試將const char *
強制回(&)[]
類型時,可能會有一個邪惡的選擇,儘管這似乎也需要做一些在constexpr
函數中不允許的事情。無論如何,如果hana
可以做出陣列,那麼當然我也可以,或者以某種方式說服它更準確地給我。
有沒有辦法解決我上面的代碼?在我忽略的hana
內有沒有更簡單的方法來做到這一點?這究竟是不可能的嗎?