带大括号初始化列表的模板参数推导

问题描述 投票:0回答:2

看这个简单的代码片段,它可以编译:

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
必须是模板)。

c++
2个回答
0
投票

不完全是您想要的,但您可以通过显式指定

foo
的模板参数类型来接近。

为了避免使用硬编码类型名称,可以使用

decltype
:

int    some_a = 1;
double some_b = 2.0;
foo<decltype(some_a), decltype(some_b)>({ some_a, some_b });

0
投票

{..}
没有类型,只能推导为
T(&)[N]
std::initilizer_list<T>

因此,由于

A
/
B
是不同的类型,因此不能使用扣除。

如果合适的话,拥有不同的重载可能是一种替代方案:

void foo(Pair<int, double> p) {/*..*/}
void foo(Pair<int, int> p) {/*..*/}
// ...
© www.soinside.com 2019 - 2024. All rights reserved.