gpt4 book ai didi

c++ - 将 void 替换为模板方法的参数

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:27:16 25 4
gpt4 key购买 nike

在我的代码中,我有一个注册其他类方法的类:

#include <iostream>
using namespace std;

template< typename C>
class Reg {
public:
template< typename R, typename A>
void register_f( string name, R ( C:: *method_p ) ( A)) { /*registration process*/ }

// template< typename R>
// void register_void_f( string name, R ( C:: *method_p ) ( void)) { /*registration process*/ }
};

class A {
public:
int f( void) { return 1; }
void g( int x) { /* some code*/ }
};


int main() {
Reg< A> r;

r.register_f( "g", &A::g);
/*1*/// r.register_f( "f", &A::f);
/*2*/// r.register_f< int, void>( "f", &A::f);
/*3*/// r.register_void_f< int>( "f", &A::f);

return 0;
}

http://ideone.com/X8PNLC

取消注释行/* 2 */给我一个错误:

template argument deduction/substitution failed:

In substitution of ‘template void register_f(std::string, R (C::*)(A)) [with R = R; A = A; C = A] [with R = int; A = void]’:

error: invalid parameter type ‘void’

行/* 1 /与/ 2 */相同,但错误消息信息不多。

我知道要解决这个问题,我可以使用方法 register_void_f,但我不想这样做,因为 register_f 是我最终 API 的一部分。

问题>如何在不引入register_void_f的情况下修复编译错误?

我有一个想法可以用部分特化的 register_f 来解决它,但我不知道该怎么做,因为在 C++ 中你不能部分特化模板化方法。

PS>我不会使用 C++11。

最佳答案

不要使用 void 来表示没有参数,使用 nothing - 像这样:

template< typename R>
void register_void_f( string name, R ( C:: *method_p ) ()) { /*registration process*/ }

关于c++ - 将 void 替换为模板方法的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25976134/

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