多个模板参数如何使用自定义推导指南?
How to use user-defined deduction guides for multiple template parameters?
我可以为具有多个模板参数的 classes 使用用户定义的演绎指南吗?我希望从构造函数参数中推导出一个指定的模板参数。构造 class 时,必须在 <>
括号中指定所有其他模板参数。示例:
#include <iostream>
template<typename T, typename A>
struct Hello
{
Hello(T x) : x(x) {}
T x;
A y;
};
Hello<A>(int) -> Hello<int, A>; // This is not a valid syntax but shows what i want to do
int main()
{
Hello h = Hello<float>((int)1); // this should be deduced to Hello<int, float>
std::cout << h.x << std::endl;
return 0;
}
在 C++11 中,您的模板参数无法从构造函数调用中推导出来。在 C++17 中可以,但对您的情况没有太大帮助,因为只允许完整的模板特化。
我可以考虑三种方法。
template <typename T, typename A>
struct Hello {
Hello(T x) : x(x) {}
T x;
A y;
};
// Approach 1: use type aliases
// Requires at least c++-11
template <typename A>
using HelloInt = Hello<int, A>;
// Approach 2: use function factories
template <typename A>
Hello<int, A> make_hello_int(int i) {
return Hello<int, A>(i);
}
// Approach 3: use template partial deduction
template <typename A, typename T>
Hello<T, A> make_hello(T i) {
return Hello<T, A>(i);
}
int main() {
// `auto` requires at least c++-11
auto k = HelloInt<float>(1);
std::cout << k.x << std::endl;
std::cout << make_hello_int<float>(2).x << std::endl;
std::cout << make_hello<float>(3).x << std::endl;
return 0;
}
我可以为具有多个模板参数的 classes 使用用户定义的演绎指南吗?我希望从构造函数参数中推导出一个指定的模板参数。构造 class 时,必须在 <>
括号中指定所有其他模板参数。示例:
#include <iostream>
template<typename T, typename A>
struct Hello
{
Hello(T x) : x(x) {}
T x;
A y;
};
Hello<A>(int) -> Hello<int, A>; // This is not a valid syntax but shows what i want to do
int main()
{
Hello h = Hello<float>((int)1); // this should be deduced to Hello<int, float>
std::cout << h.x << std::endl;
return 0;
}
在 C++11 中,您的模板参数无法从构造函数调用中推导出来。在 C++17 中可以,但对您的情况没有太大帮助,因为只允许完整的模板特化。
我可以考虑三种方法。
template <typename T, typename A>
struct Hello {
Hello(T x) : x(x) {}
T x;
A y;
};
// Approach 1: use type aliases
// Requires at least c++-11
template <typename A>
using HelloInt = Hello<int, A>;
// Approach 2: use function factories
template <typename A>
Hello<int, A> make_hello_int(int i) {
return Hello<int, A>(i);
}
// Approach 3: use template partial deduction
template <typename A, typename T>
Hello<T, A> make_hello(T i) {
return Hello<T, A>(i);
}
int main() {
// `auto` requires at least c++-11
auto k = HelloInt<float>(1);
std::cout << k.x << std::endl;
std::cout << make_hello_int<float>(2).x << std::endl;
std::cout << make_hello<float>(3).x << std::endl;
return 0;
}