C ++ 17部分推导指南

时间:2019-05-28 23:11:51

标签: c++ c++17 template-deduction

我正在尝试编写一个推论指南,该指南仅从给定的构造函数参数中检测许多类型名称之一,并且要求用户手动输入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

2 个答案:

答案 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;
};