看这个简单的代码片段,它可以编译:
template <typename A, typename B>
struct Pair {
A a;
B b;
};
template <typename A, typename B>
void foo(Pair<A, B> p) {
}
int main() {
foo(Pair{1, 2.0});
}
但是,如果我从调用
Pair
中删除 foo
,它不会编译:
int main() {
foo({1, 2.0}); // does not compile: cannot deduce template parameters
}
有什么技巧可以让
foo({1, 2.0});
编译吗?
注意,我不坚持使用
Pair
。我想要一个解决方案,允许我使用 foo({some_a, some_b})
的语法(其中 some_a
和 some_b
可以具有任何类型,因此 foo
必须是模板)。
不完全是您想要的,但您可以通过显式指定
foo
的模板参数类型来接近。
为了避免使用硬编码类型名称,可以使用
decltype
:
int some_a = 1;
double some_b = 2.0;
foo<decltype(some_a), decltype(some_b)>({ some_a, some_b });
{..}
没有类型,只能推导为T(&)[N]
或std::initilizer_list<T>
。
因此,由于
A
/B
是不同的类型,因此不能使用扣除。
如果合适的话,拥有不同的重载可能是一种替代方案:
void foo(Pair<int, double> p) {/*..*/}
void foo(Pair<int, int> p) {/*..*/}
// ...