以第二个参数为默认参数的模板化C++函数

4

我有一个像这样的函数:

template <typename A, typename B>
void foo(const B & b)
{
    ...
}

A应该是可选的;如果在函数调用中没有明确定义,它应该被设置为B。目的是避免不必要的冗长代码:

int i;

// First variant: A is specified explicitly
foo<float>(i);

// Second variant: A is set to B implicitly
// This is because foo < int > (i) is unnecessarily verbose
foo(i);

不过,目前我还没有找到这样做的方法。有人能想出一个吗?


2
为什么需要两个模板参数?这个例子看起来好像只需要 B - Igor G
模板参数是位置相关的,如果您可以交换B和A,则可以通过从单参数版本调用两个参数版本来执行此操作。编译器将优化其余部分。 - Mgetz
模板 <typename B,typename A = B>? - Alexander Dyagilev
1
@AlexanderDyagilev 这会阻止 foo<float>(i); 能够正常工作。 - NathanOliver
2
因为你明确地指定了 B 而不是 A,所以 foo<float>(i); 会使得 A = B = float 而不是 B = intA = float - O'Neil
显示剩余3条评论
1个回答

7
#include <type_traits>

struct deduce_tag;

template <typename PreA = deduce_tag, typename B>
void foo(const B & b) {
    using A = std::conditional_t<
        std::is_same<PreA, deduce_tag>::value,
        B,
        PreA
    >;
}

不错!我总是忘记默认模板参数不需要像默认函数参数一样放在最后。 - StoryTeller - Unslander Monica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接