0

例如,我有以下模板函数:

template<class IntType = typename boost::uintmax_t>
IntType someFunnyFunc(IntType x, IntType y, IntType z) { ... }

现在我有以下代码:

int main() {
    short a=1, b=2, c=3;
    someFunnyFunc(a, b, c);
    return 0;
}

所有编译器都会生成函数吗

boost::uintmax_t someFunnyFunc(boost::uintmax_t x, boost::uintmax_t y, boost::uintmax_t z) { ... }

,因为short可以转换为boost::uintmax_t,或者一些编译器会生成

short someFunnyFunc(short x, short y, short z) {...}

我需要这个,因为我的算法使用循环,当我使用短整数而不是大整数时,循环更频繁。

你可能会问,为什么我不简单地定义boost::uintmax_t someFunnyFunc(boost::uintmax_tx, boost::uintmax_t y, boost::uintmax_tz) { ... }自己并完成它。我这样做是因为我想让使用自定义整数类型成为可能,这样可以使用平台不直接支持的更大整数。

编辑: 这能解决我的问题吗:

template<class IntType>
IntType someFunnyFunc(IntType x, IntType y, IntType z) { ... }

boost::uintmax_t someFunnyFunc(boost::uintmax_t x, boost::uintmax_t y, boost::uintmax_t z) {
    return someFunnyFunc<boost::uintmax_t>(x, y, z);
}
4

1 回答 1

2

编译器不会执行类型转换。它们将生成:

short someFunnyFunc(short x, short y, short z)

简而言之,编译器选择“阻力最小的路径”。执行类型转换存在“阻力”,但生成与您的参数完美匹配的函数签名没有“阻力”。

如果有多个相等“阻力”的路径,您可能会得到一个模棱两可(或没有匹配的函数)错误(编译器应该采用哪个路径?)。例如,如果您尝试传递shortintlong您将收到错误消息,因为您尝试执行的操作没有正确匹配的签名。编译器无法推断出函数的正确类型,因为有多种可能性,没有一种是“最好的”。

编辑:不,这不会解决你的问题。如果您传递shorts,编译器将选择模板化函数(并使用IntType = short)。

someFunnyFunc<boost::uintmax_t>(short_1, short_2, short_3);如果你想使用boost::uintmax_t但传递short参数,你可以这样做。你也可以这样做:

template<class IntType>
IntType someFunnyFunc(IntType x, IntType y, IntType z) { ... }

// If you try to pass shorts, the compiler will opt for this version:
boost::uintmax_t someFunnyFunc(short x, short y, short z) {
    return someFunnyFunc<boost::uintmax_t>(x, y, z);
}

假设你想使用boost::uintmax_t但仍然通过shorts.

于 2013-02-23T20:01:21.547 回答