我正在尝试编写一个推论指南,该指南仅从给定的构造函数参数中检测许多类型名称之一,并且要求用户手动输入int
size
template <int size, typename T>
struct Board
{
array<array<T, size>, size> values;
explicit Board(const vector<T>& raw_values){
}
};
template <int size, typename T> Board(const vector<T>&) -> Board<int size, T>;
上面的想法是仍然应该迫使用户输入模板的“ int size
”参数,但是应该从构造函数的参数中推导“ typename T
”,这可能吗?
正确规范后,这就是方法的调用方式
auto b = Board<3>(initialStateVector);
当前,我需要这样输入;
auto b = Board<3, int>(initialStateVector);
所以基本上,我希望从给定的int
推导上面的“ initialStateVector
”
const vector<int>& raw_values
答案 0 :(得分:6)
上面的想法是仍然应该迫使用户输入模板的“ int size”参数,但是应该从构造函数的参数中推导出“ typename T”,这可能吗?
根据this cppreference page中的注释(及以下示例)
仅当不存在模板参数列表时才执行类模板参数推导。如果指定了模板参数列表,则不会进行推导。
不,这是不可能的(在C ++ 17中不是;我们希望在该标准的未来版本中能够使用。)
如果您想显式显示大小并推断出类型,我能想象的最好是通过一个古老的make_something函数。
我的意思是(使用 from sqlalchemy import inspect
def get_model_changes(model):
"""
Return a dictionary containing changes made to the model since it was
fetched from the database.
The dictionary is of the form {'property_name': [old_value, new_value]}
Example:
user = get_user_by_id(420)
>>> '<User id=402 email="business_email@gmail.com">'
get_model_changes(user)
>>> {}
user.email = 'new_email@who-dis.biz'
get_model_changes(user)
>>> {'email': ['business_email@gmail.com', 'new_email@who-dis.biz']}
"""
state = inspect(model)
changes = {}
for attr in state.attrs:
hist = state.get_history(attr.key, True)
if not hist.has_changes():
continue
old_value = hist.deleted[0] if hist.deleted else None
new_value = hist.added[0] if hist.added else None
changes[attr.key] = [old_value, new_value]
return changes
def has_model_changed(model):
"""
Return True if there are any unsaved changes on the model.
"""
return bool(get_model_changes(model))
作为大小,如std::size_t
和几乎所有的STL)
std::array
在C ++ 11中也应该起作用。
答案 1 :(得分:0)
我想出了使用大小提示对象的解决方法
template<int size>
struct SizeHint {};
您的类会将其作为附加的构造方法参数:
Board(SizeHint<size>, const std::vector<T>& raw_values)
您可以这样调用构造函数:
auto b = Board(SizeHint<2>{}, v);
这种方法也适用于类型提示(我最初的动机是如何找到该线程的):
template<typename T>
struct TypeHint{};
template<typename Result, typename T>
struct S {
S(TypeHint<Result>, T arg) : t{arg}{}
Result r() {return t;}
T t;
};
#include <iostream>
int main() {
S s{TypeHint<int>{}, 5.7};
std::cout << s.r() << std::endl;
}
这也可以与可变参数模板结合使用:
template<typename Result, typename... Args>
struct S {
S(TypeHint<Result>, Args... args) : t{args...}{}
std::tuple<Args...> t;
};