C++ c++;使用模板生成最通用的函数

C++ c++;使用模板生成最通用的函数,c++,templates,c++11,C++,Templates,C++11,我需要创建一个尽可能通用的函数,假设我有两个maps要处理-- 现在,如果我想编写一个能与任何类型的map(即map模板实例化中的代码是用来编译的。因此,当根据模板参数的类型执行不同的操作时,通常不能将它们包含在一个函数中。相反,您应该将处理委托给一个适当重载的函数,该函数本身可能是一个条件适用的模板例如,您的dosomething()函数可能如下所示: // suitable declaration/definition of dosomething_apply() go here; see

我需要创建一个尽可能通用的函数,假设我有两个
map
s要处理--


现在,如果我想编写一个能与任何类型的
map
(即
map模板实例化中的代码是用来编译的。因此,当根据模板参数的类型执行不同的操作时,通常不能将它们包含在一个函数中。相反,您应该将处理委托给一个适当重载的函数,该函数本身可能是一个条件适用的模板例如,您的
dosomething()
函数可能如下所示:

// suitable declaration/definition of dosomething_apply() go here; see below

template <typename A, typename B>
void dosomething(std::map<A, B> const& m) {
    for (auto&& me: m) {
        dosomething_apply(me.second);
    }
}
它只是创建了trait的默认版本,声明trait不是通过派生自
std::false_type
来匹配的。然后,对应的模板被专门化为上面列出的类模板,每个模板都是从
std::true_type
派生的。这样一来,
形式的表达式就是\u specialized::value
can用于检测该特征是否适用于类型
T

下一步是提供合适的处理函数。由于特征存在或不存在,使用
enable\u if\u t
是一种简单的方法:

template <typename T>
std::enable_if_t<!is_subscripted<T>::value>
dosomething_apply(T const& value) {
    std::cout << "value=" << value << '\n';
}

template <typename T>
std::enable_if_t<is_subscripted<T>::value>
dosomething_apply(T const& range) {
    for (auto size(range.size()), i(size - size); i != size; ++i) {
        std::cout << "range=" << range[i] << '\n';
    }
}

模板实例化中的代码用于编译。因此,当根据模板参数的类型执行不同的操作时,通常不能将它们包含在一个函数中。相反,您应该将处理委托给适当重载的函数,该函数本身可能是条件适用的模板。例如,
dosomething()
函数可能如下所示:

// suitable declaration/definition of dosomething_apply() go here; see below

template <typename A, typename B>
void dosomething(std::map<A, B> const& m) {
    for (auto&& me: m) {
        dosomething_apply(me.second);
    }
}
它只是创建了trait的默认版本,声明trait不是通过派生自
std::false_type
来匹配的。然后,对应的模板被专门化为上面列出的类模板,每个模板都是从
std::true_type
派生的。这样一来,
形式的表达式就是\u specialized::value
can用于检测该特征是否适用于类型
T

下一步是提供合适的处理函数。由于特征存在或不存在,使用
enable\u if\u t
是一种简单的方法:

template <typename T>
std::enable_if_t<!is_subscripted<T>::value>
dosomething_apply(T const& value) {
    std::cout << "value=" << value << '\n';
}

template <typename T>
std::enable_if_t<is_subscripted<T>::value>
dosomething_apply(T const& range) {
    for (auto size(range.size()), i(size - size); i != size; ++i) {
        std::cout << "range=" << range[i] << '\n';
    }
}

模板实例化中的代码用于编译。因此,当根据模板参数的类型执行不同的操作时,通常不能将它们包含在一个函数中。相反,您应该将处理委托给适当重载的函数,该函数本身可能是条件适用的模板。例如,
dosomething()
函数可能如下所示:

// suitable declaration/definition of dosomething_apply() go here; see below

template <typename A, typename B>
void dosomething(std::map<A, B> const& m) {
    for (auto&& me: m) {
        dosomething_apply(me.second);
    }
}
它只是创建了trait的默认版本,声明trait不是通过派生自
std::false_type
来匹配的。然后,对应的模板被专门化为上面列出的类模板,每个模板都是从
std::true_type
派生的。这样一来,
形式的表达式就是\u specialized::value
can用于检测该特征是否适用于类型
T

下一步是提供合适的处理函数。由于特征存在或不存在,使用
enable\u if\u t
是一种简单的方法:

template <typename T>
std::enable_if_t<!is_subscripted<T>::value>
dosomething_apply(T const& value) {
    std::cout << "value=" << value << '\n';
}

template <typename T>
std::enable_if_t<is_subscripted<T>::value>
dosomething_apply(T const& range) {
    for (auto size(range.size()), i(size - size); i != size; ++i) {
        std::cout << "range=" << range[i] << '\n';
    }
}

模板实例化中的代码用于编译。因此,当根据模板参数的类型执行不同的操作时,通常不能将它们包含在一个函数中。相反,您应该将处理委托给适当重载的函数,该函数本身可能是条件适用的模板。例如,
dosomething()
函数可能如下所示:

// suitable declaration/definition of dosomething_apply() go here; see below

template <typename A, typename B>
void dosomething(std::map<A, B> const& m) {
    for (auto&& me: m) {
        dosomething_apply(me.second);
    }
}
它只是创建了trait的默认版本,声明trait不是通过派生自
std::false_type
来匹配的。然后,对应的模板被专门化为上面列出的类模板,每个模板都是从
std::true_type
派生的。这样一来,
形式的表达式就是\u specialized::value
can用于检测该特征是否适用于类型
T

下一步是提供合适的处理函数。由于特征存在或不存在,使用
enable\u if\u t
是一种简单的方法:

template <typename T>
std::enable_if_t<!is_subscripted<T>::value>
dosomething_apply(T const& value) {
    std::cout << "value=" << value << '\n';
}

template <typename T>
std::enable_if_t<is_subscripted<T>::value>
dosomething_apply(T const& range) {
    for (auto size(range.size()), i(size - size); i != size; ++i) {
        std::cout << "range=" << range[i] << '\n';
    }
}

你所说的“B的类型是单例”是什么意思?这里的单例是什么意思?你可能在寻找。单例指的是一个不是标准容器类型的对象/变量@0x499602D2@chris“印刷”不是这里的主要目标,这个
dump
函数只是一个例子,它可以是任何东西。好的,这个实现是开源的,所以请随时注意它使用的技术并根据需要应用它们。你说的“B的类型是单例”是什么意思.这里的singleton是什么意思?您可能正在查找。我所说的singleton是指不是标准容器类型的对象/变量@0x499602D2@chris“印刷”不是这里的主要目标,这个
dump
函数只是一个例子,它可以是任何东西。好的,这个实现是开源的,所以请随时注意它使用的技术并根据需要应用它们。你说的“B的类型是单例”是什么意思.这里的singleton是什么意思?您可能正在查找。我所说的singleton是指不是标准容器类型的对象/变量@0x499602D2@chris“印刷”不是这里的主要目标,这个
dump
函数只是一个例子,它可以是任何东西。好的,这个实现是开源的,所以请随时注意它使用的技术并根据需要应用它们。你说的“B的类型是单例”是什么意思.这里的singleton是什么意思?您可能正在查找。我所说的singleton是指不是标准容器类型的对象/变量@0x499602D2@chris“印刷”不是这里的主要目标,这个
dump
函数只是一个例子,它可以是任何东西。好的,这个实现是开源的,所以请随时注意它使用的技术并应用它们