gpt4 book ai didi

c++如何取模板函数实例的地址?

转载 作者:可可西里 更新时间:2023-11-01 16:11:03 26 4
gpt4 key购买 nike

对于重要的代码(也在 wandbox here 上)感到抱歉

#include <memory>
#include <cstdio>

template< typename T, size_t N, typename ... Args >
void test_1 ( Args ... args)
{
using namespace std;

if constexpr( 1 > (sizeof... (args)) ) {
return;
}
else
{
auto arg_list [[maybe_unused]] = { args ... };
}
}
template< typename T, size_t N, typename ... Args >
void test_2 ( Args ... args)
{
auto arg_list [[maybe_unused]] = { args ... };
}
///////////////////////////////////////////////////////////
int main()
{
test_1<int,3>(1,2,3);
test_2<int,3>(1,2,3);

// taking the function pointer (aka address of) leads to
// full instantiation of function template
constexpr auto adr_1 [[maybe_unused]] = std::addressof(test_1<int,3>);
// no can do --> constexpr auto adr_2 = std::addressof(test_2<int,3>);

}

所以。从上面看来,采用模板函数指针(又名地址)似乎会导致函数模板的完整实例化。

这有点不幸。如果一个人获取模板函数实例化的地址,那将产生一个完整的实例化。即使那个永远不会被调用。

     // pointer to instance made but instance never used
constexpr auto adr_5 [[maybe_unused]] = std::addressof(test_1<float,9>);
// pointer to instance made but instance never used
constexpr auto adr_of_big_foot_gun
[[maybe_unused]] = std::addressof(test_1<bool,99>);
// pointer to instance made but instance never used
constexpr auto adr_of_crazy [[maybe_unused]] =
std::addressof(test_1<char, 0xFFFF>);

现在。如何规避这种情况?请注意上面的代码意味着编译器会这样做:

        // this line
std::addressof( test_2<int,3> )

// provokes something like this
// which needs to be compiled
test_2<int,3>(void) ;

这就是为什么可以取上面的test1地址,但不能取test_2地址的原因。也许对我来说,这根本没有任何意义。通过这个,我特别意味着编译函数模板实例就像通过使用 void 参数调用它一样?这反过来意味着,如果没有 constexpr-if,将很难在上面编写 test_1。这反过来(几乎)意味着没有 c++11 也没有 c++14。

请讨论...

最佳答案

Which is kind-of-a unfortunate. If one takes the address of a template function instantiation, that will produce a full instantiation.

这并不不幸。这就是语言的工作原理。如果你得到一个模板函数的地址(从函数模板实例化的函数),这个函数一定存在。换句话说,它必须从相应的功能模板实例化。

How can this be circumvented?

没有办法。这是一种完全合理的预期行为。

关于c++如何取模板函数实例的地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51536688/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com