我是模板和概念的高級用法的新手,所以這里有一個有點復雜的問題:
我
Traits對每個Source類的許多特征都有一些概念:template<typename _Traits> concept Traits = requires { std::same_as<std::decay_t<decltype(_Traits::token)>, std::string_view>; };我有一些模板類使用這個概念來處理
object_one各種特征(例如,一半的Source類回傳object_one):template <concepts::Traits _Traits> class Object_one_handler final { static std::string handle_object(const object_one& obj) {/*...*/} };然后,我有
Objects_handlers處理程式的各種物件的概念從一組{object_one, object_two, object_three}來自各種Sources與他們Traits:template<template <concepts::Traits _Traits> class _Objects_handlers, typename _Object> concept Objects_handlers = requires(const _Object& obj) { // has handle_object method { _Objects_handlers<???????>::handle_object(obj) } -> std::same_as<std::string>; };最后,我創建了一些
database指定為模板引數Object_handler:template<concepts::Objects_handlers _handler> class database {...};
(其實所有的概念都有附加要求,不過這里無所謂)
所以問題在于最后一個Objects_handlers概念:
template<template <concepts::Traits _Traits> class _Objects_handlers, typename _Object>
concept Objects_handlers = requires(const _Object& obj)
{
// has handle_object method
{ _Objects_handlers<???????>::handle_object(obj) } -> std::same_as<std::string>;
^^^^^^^
};
我無法在_Objects_handlers沒有模板引數的情況下檢查方法(顯然),并且我無法正確設定模板引數,該引數必須是Traits.
我怎樣才能做到這一點?
而實際上它可能是在類的Objects_handlers模板中使用的問題database,所以還有一個問題:如何使用它?
PS 這可能是 XY 問題,也可能根本不是關于概念的問題......也許與策略模式的組合會更有用,但仍然想嘗試創建這個可能無用但可行的概念。
uj5u.com熱心網友回復:
讓我們減少很多這個問題。
template <typename T>
struct C {
void f();
};
現在,您的目標是撰寫一個接受任何類模板(例如C)的概念,并檢查它的每個特化是否都有一個名為 的空成員函式f。
template <template <typename> class Z>
concept HasF = requires (Z<???> z) {
z.f();
};
問題是 - C 中的類模板不能像這樣作業。即使對于特定的類模板,例如C,您也不能要求每個專業化都有f. 沒有辦法確保像某人一樣,在某處,沒有添加:
template <> struct C<std::vector<std::list<std::deque<int>>>> { };
您所能做的就是檢查特定型別是否具有名為f. 那就是:
template <typename T>
concept HasF = requires (T t) { t.f(); };
型別約束語法template <Concept T>僅適用于約束型別的概念,而不適用于約束模板或值的概念。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/312598.html
