委托模板元编程的问题
Problems with Delegate Template Metaprogramming
下面的代码是由另一个程序员从Yingle Jia的代码中改编的,我必须将其移植到Linux上。它在VS2010中编译得很好,但是当我尝试用gcc 4.6.3在Ubuntu中构建时,它在
处显示错误。template <class R ACF_DELEGATE_COMMA ACF_DELEGATE_TEMPLATE_PARAMS>
class Delegate<R (ACF_DELEGATE_TEMPLATE_ARGS)>
错误信息为:
../../../mySDK-master/include/abc/DelegateTemplate.h:45:1: error: pasting "," and "class" does not give a valid preprocessing token
../../../mySDK-master/include/abc/DelegateTemplate.h:46:1: error: pasting "," and "T" does not give a valid preprocessing token
../../../mySDK-master/include/abc/DelegateTemplate.h:74:1: error: pasting "," and "a" does not give a valid preprocessing token
第45行和第46行是我粘贴在上面的DelegateTemplate.h
的两行代码。
Delegate.h
// Copyright (C) 2004-2005 Yingle Jia
//
// Permission to copy, use, modify, sell and distribute this software is
// granted provided this copyright notice appears in all copies.
// This software is provided "as is" without express or implied warranty,
// and with no claim as to its suitability for any purpose.
//
// AcfDelegate.h
//
#ifndef __Acf_Delegate__
#define __Acf_Delegate__
#ifndef __Acf_Corlib__
#include <stdexcept> // for std::runtime_error
#endif // #ifndef __Acf_Corlib__
#include <utility> // for std::pair
// Macros for template metaprogramming
#define ACF_JOIN(a, b) ACF_DO_JOIN(a, b)
#define ACF_DO_JOIN(a, b) ACF_DO_JOIN2(a, b)
#define ACF_DO_JOIN2(a, b) a##b
#define ACF_MAKE_PARAMS1_0(t)
#define ACF_MAKE_PARAMS1_1(t) t##1
#define ACF_MAKE_PARAMS1_2(t) t##1, ##t##2
#define ACF_MAKE_PARAMS1_3(t) t##1, ##t##2, ##t##3
#define ACF_MAKE_PARAMS1_4(t) t##1, ##t##2, ##t##3, ##t##4
#define ACF_MAKE_PARAMS1_5(t) t##1, ##t##2, ##t##3, ##t##4, ##t##5
#define ACF_MAKE_PARAMS1_6(t) t##1, ##t##2, ##t##3, ##t##4, ##t##5, ##t##6
#define ACF_MAKE_PARAMS2_0(t1, t2)
#define ACF_MAKE_PARAMS2_1(t1, t2) t1##1 t2##1
#define ACF_MAKE_PARAMS2_2(t1, t2) t1##1 t2##1, t1##2 t2##2
#define ACF_MAKE_PARAMS2_3(t1, t2) t1##1 t2##1, t1##2 t2##2, t1##3 t2##3
#define ACF_MAKE_PARAMS2_4(t1, t2) t1##1 t2##1, t1##2 t2##2, t1##3 t2##3, t1##4 t2##4
#define ACF_MAKE_PARAMS2_5(t1, t2) t1##1 t2##1, t1##2 t2##2, t1##3 t2##3, t1##4 t2##4, t1##5 t2##5
#define ACF_MAKE_PARAMS2_6(t1, t2) t1##1 t2##1, t1##2 t2##2, t1##3 t2##3, t1##4 t2##4, t1##5 t2##5, t1##6 t2##6
#define ACF_MAKE_PARAMS1(n, t) ACF_JOIN(ACF_MAKE_PARAMS1_, n) (t)
#define ACF_MAKE_PARAMS2(n, t1, t2) ACF_JOIN(ACF_MAKE_PARAMS2_, n) (t1, t2)
namespace CORE
{
#ifndef __Acf_Corlib__
class InvalidOperationException : public std::runtime_error
{
public:
InvalidOperationException() : std::runtime_error("Invalidate operation")
{
}
};
#endif // #ifndef __Acf_Corlib__
template <class TSignature>
class Delegate; // no body
}
// Specializations
#define ACF_DELEGATE_NUM_ARGS 0 // Delegate<R ()>
#include "DelegateTemplate.h"
#undef ACF_DELEGATE_NUM_ARGS
#define ACF_DELEGATE_NUM_ARGS 1 // Delegate<R (T1)>
#include "DelegateTemplate.h"
#undef ACF_DELEGATE_NUM_ARGS
#define ACF_DELEGATE_NUM_ARGS 2 // Delegate<R (T1, T2)>
#include "DelegateTemplate.h"
#undef ACF_DELEGATE_NUM_ARGS
#define ACF_DELEGATE_NUM_ARGS 3 // Delegate<R (T1, T2, T3)>
#include "DelegateTemplate.h"
#undef ACF_DELEGATE_NUM_ARGS
#define ACF_DELEGATE_NUM_ARGS 4 // Delegate<R (T1, T2, T3, T4)>
#include "DelegateTemplate.h"
#undef ACF_DELEGATE_NUM_ARGS
#define ACF_DELEGATE_NUM_ARGS 5 // Delegate<R (T1, T2, T3, T4, T5)>
#include "DelegateTemplate.h"
#undef ACF_DELEGATE_NUM_ARGS
#define ACF_DELEGATE_NUM_ARGS 6 // Delegate<R (T1, T2, T3, T4, T5, T6)>
#include "DelegateTemplate.h"
#undef ACF_DELEGATE_NUM_ARGS
#define N_INVOKE(DELEGATE,PARAMS) { if(DELEGATE) DELEGATE.Invoke PARAMS; }
#define N_EVENT_HANDLER(a) std::make_pair(this,&a);
#endif // #ifndef __Acf_Delegate__
和DelegateTemplate.h的一小部分
// Copyright (C) 2004-2005 Yingle Jia
//
// Permission to copy, use, modify, sell and distribute this software is
// granted provided this copyright notice appears in all copies.
// This software is provided "as is" without express or implied warranty,
// and with no claim as to its suitability for any purpose.
//
// AcfDelegateTemplate.h
//
// Note: this header is a header template and must NOT have multiple-inclusion
// protection.
#define ACF_DELEGATE_TEMPLATE_PARAMS ACF_MAKE_PARAMS1(ACF_DELEGATE_NUM_ARGS, class T)
// class T0, class T1, class T2, ...
#define ACF_DELEGATE_TEMPLATE_ARGS ACF_MAKE_PARAMS1(ACF_DELEGATE_NUM_ARGS, T)
// T0, T1, T2, ...
#define ACF_DELEGATE_FUNCTION_PARAMS ACF_MAKE_PARAMS2(ACF_DELEGATE_NUM_ARGS, T, a)
// T0 a0, T1 a1, T2 a2, ...
#define ACF_DELEGATE_FUNCTION_ARGS ACF_MAKE_PARAMS1(ACF_DELEGATE_NUM_ARGS, a)
// a0, a1, a2, ...
//// Comma if nonzero number of arguments
#if ACF_DELEGATE_NUM_ARGS == 0
#define ACF_DELEGATE_COMMA
#else
#define ACF_DELEGATE_COMMA ,
#endif
namespace CORE
{
//-------------------------------------------------------------------------
// class Delegate<R (T1, T2, ..., TN)>
template <class R ACF_DELEGATE_COMMA ACF_DELEGATE_TEMPLATE_PARAMS>
class Delegate<R (ACF_DELEGATE_TEMPLATE_ARGS)>
{
// Declarations
private:
class DelegateImplBase
{
// Fields
public:
DelegateImplBase* Previous; // singly-linked list
// Constructor/Destructor
protected:
DelegateImplBase() : Previous(NULL) { }
DelegateImplBase(const DelegateImplBase& other) : Previous(NULL) { }
public:
virtual ~DelegateImplBase() { }
// Methods
public:
virtual DelegateImplBase* Clone() const = 0;
virtual R Invoke(ACF_DELEGATE_FUNCTION_PARAMS) const = 0;
};
是因为在gcc中缺乏模板元编程支持吗?我检查了是否因为可变模板,但这应该在gcc 4.3中修复。如果您能帮忙解决这个错误,我将不胜感激。
解决。我浏览了这一页,了解了如何使用令牌粘贴操作符:
结果是有一些额外的##
操作符被Visual Studio忽略了,但gcc没有。我修改的行是:
#define ACF_MAKE_PARAMS1_0(t)
#define ACF_MAKE_PARAMS1_1(t) t ## 1
#define ACF_MAKE_PARAMS1_2(t) t ## 1, t ## 2
#define ACF_MAKE_PARAMS1_3(t) t ## 1, t ## 2, t ## 3
#define ACF_MAKE_PARAMS1_4(t) t ## 1, t ## 2, t ## 3, t ## 4
#define ACF_MAKE_PARAMS1_5(t) t ## 1, t ## 2, t ## 3, t ## 4, t ## 5
#define ACF_MAKE_PARAMS1_6(t) t ## 1, t ## 2, t ## 3, t ## 4, t ## 5, t ## 6
前面的行有类似##t##2
的东西,它产生了错误。我把它改成了t##2
,它工作了!荣耀哈利路亚!:-)所以结束了我的磨难与模板元编程。
相关文章:
- C++模板编程设计问题 - 根据输入文件返回不同的类型
- Frank Luna 在他的书"使用 DirectX12 进行 3D 游戏编程"的介绍中盒子示例的问题
- 此动态编程问题的自上而下方法
- 返回不停止函数,递归函数问题?(编程练习,动态规划,Levenshtein 回溯)
- 寻找解决这个动态编程问题的提示
- 面临在 if 语句之外打印变量数据的问题 完成使用 Qt 编程
- 竞争性编程问题说错了答案
- 模板编程初学者问题
- 使用虚幻引擎4编程的平台游戏中的偏转问题
- 以编程方式锁定注册表项以避免并发问题
- 编程问题和概念
- C 编程问题
- 我可以使用Boost::Asio而不用担心网络编程问题吗?
- 基本C++编程问题
- 更改为整数时的双精度值编程问题
- 很少有QT编程问题
- 枚举的元编程问题
- 关于作用域的一般编程问题
- 编译器构造 - C++ 编程问题 2.
- C++ 编程问题